首页 文章

分段错误的行号

提问于
浏览
46

我可以设置任何gcc选项,它会给我分段错误的行号吗?

我知道我可以:

  • 逐行调试

  • 将printfs放入代码中以缩小范围 .

编辑:

gdb上的

8 回答

  • 10

    我不知道gcc选项,但你应该能够使用gdb运行应用程序,然后当它崩溃时,键入 where 以在退出时查看堆栈,这应该让你关闭 .

    $ gdb blah
    (gdb) run
    (gdb) where
    

    编辑完整性:

    您还应该确保使用 -g gcc选项构建带有调试标志的应用程序,以在可执行文件中包含行号 .

    另一种选择是使用 bt (backtrace)命令 .

  • 60

    这是一个完整的shell / gdb会话

    $ 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...
    

    快乐的黑客:-)

  • 4

    当程序获得SEGV信号时,您可以让gcc为您打印堆栈跟踪,类似于Java和其他更友好的语言处理空指针异常的方式 . 有关详细信息,请参阅我的答案:

    关于这个的好处是你可以把它留在你的代码中;你不需要通过gdb运行以获得良好的调试输出 .

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

  • 1

    在valgrind下运行它 .

  • 1

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

    您也可以使用gdb打开核心转储(但您需要-g) .

  • 7

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

    • 小学:也许你只是试图分析尸检核心转储 . (如果你启动一个调试会话,但是根本没有运行程序 . 在运行gdb时忘记添加第三个参数( core ),否则你会以相同的状态启动,不会附加到任何特定进程或记忆图像 .

    • 困难:如果你的程序正在运行但是你的gdb说"No stack"也许你的堆栈指针被严重破坏了 . 在这种情况下,您可能在某处出现缓冲区溢出问题,严重到足以将您的运行时状态完全混合 . GCC 4.1支持使用 -fstack-protector-all 启用的ProPolice "Stack Smashing Protector" . 它可以通过补丁添加到GCC 3.x.

  • 4

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

    在程序出现故障后,GDB可以通过“bt”(“backtrace”的缩写)命令为您提供发生崩溃的行 . 这不仅会给你崩溃的线,而且会给整个程序堆栈(所以你可以看到发生崩溃的函数) .

  • 20

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

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

相关问题