代码之家  ›  专栏  ›  技术社区  ›  Rohit

分段故障的行号

  •  46
  • Rohit  · 技术社区  · 17 年前

    我是否可以设置任何gcc选项来提供分段故障的行号?

    1. 逐行调试
    2. 在代码中放入printfs以缩小范围。

    1. bt where
    2. Helpful suggestion
    8 回复  |  直到 9 年前
        1
  •  71
  •   Drew Noakes    13 年前

    我不知道gcc选项,但您应该能够使用gdb运行应用程序,然后当它崩溃时,键入 where 在堆栈退出时查看堆栈,这将使您接近它。

    $ gdb blah
    (gdb) run
    (gdb) where
    

    -g gcc选项在可执行文件中包括行号。

    另一个选择是使用 bt (回溯)命令。

        2
  •  25
  •   Jonas Kölker    17 年前

    $ gcc -ggdb myproj.c
    $ gdb a.out
    gdb> run --some-option=foo --other-option=bar
    (gdb will say your program hit a segfault)
    gdb> bt
    (gdb prints a stack trace)
    gdb> q
    [are you sure, your program is still running]? y
    $ emacs myproj.c # heh, I know what the error is now...
    

    快乐黑客:-)

        3
  •  10
  •   Community Mohan Dere    9 年前

    当程序获得SEGV信号时,可以让gcc打印stacktrace,这与Java和其他更友好的语言处理空指针异常的方式类似。有关更多详细信息,请参见我的回答:

    如果使用-g编译并按照那里的说明进行操作,则可以使用命令行工具,如 addr2line 从输出中获取文件/行信息。

        4
  •  7
  •   anonnn    15 年前

        5
  •  4
  •   cbrulak    17 年前

    您还需要在-g上使用调试标志进行构建

        6
  •  4
  •   Liudvikas Bukys    11 年前

    如果前面所有关于使用调试(-g)编译并在调试器(gdb,run,bt)下运行的建议都不适用于您,那么:

    • core )当您运行gdb时,否则您将以相同的状态启动,而不是附加到任何特定的进程或内存映像。
    • 困难:如果你的程序正在运行,但是你的gdb说“没有堆栈”,那么你的堆栈指针可能被严重破坏了。在这种情况下,您可能在某个地方遇到了缓冲区溢出问题,严重到足以完全破坏您的运行时状态。GCC 4.1支持通过启用的专有“堆栈粉碎保护器” -fstack-protector-all
        7
  •  1
  •   SoapBox    17 年前

    GCC没有提供此信息的方法,您必须依赖GDB这样的外部程序。

        8
  •  1
  •   kiwixz    10 年前

    No stack 当程序成功退出时,问题似乎发生了。

    作为记录,我遇到了这个问题,因为我忘记了代码中的返回,这使得我的程序以失败代码退出。