我可以设置任何 gcc 选项来提供分段错误的行号吗?
我知道我可以:
- 逐行调试
- 将 printfs 放入代码中以缩小范围。
编辑:
bt
/where
on gdb give No stack。- 有用的建议
我可以设置任何 gcc 选项来提供分段错误的行号吗?
我知道我可以:
编辑:
bt
/ where
on gdb give No stack。我不知道 gcc 选项,但是您应该能够使用 gdb 运行应用程序,然后当它崩溃时,键入where
以查看退出时的堆栈,这应该可以让您关闭。
$ gdb blah
(gdb) run
(gdb) where
编辑完整性:
您还应该确保使用-g
gcc 选项在可执行文件中包含行号时使用调试标志构建应用程序。
另一种选择是使用bt
(backtrace) 命令。
这是一个完整的 shell/gdb 会话
$ gcc -ggdb myproj.c $ gdb a.out gdb> 运行 --some-option=foo --other-option=bar (gdb 会说你的程序遇到了段错误) gdb>bt (gdb 打印堆栈跟踪) gdb>q [您确定,您的程序仍在运行]?是的 $ emacs myproj.c # 呵呵,我现在知道错误是什么了...
快乐的黑客:-)
当您的程序收到 SEGV 信号时,您可以让 gcc 为您打印堆栈跟踪,类似于 Java 和其他更友好的语言处理空指针异常的方式。有关更多详细信息,请参见我的答案:
这样做的好处是你可以把它留在你的代码中;您无需通过 gdb 运行即可获得良好的调试输出。
如果您使用 -g 编译并按照那里的说明进行操作,则可以使用addr2line 之类的命令行工具从输出中获取文件/行信息。
在 valgrind 下运行它。
您还需要在 -g 上使用调试标志进行构建
您也可以使用 gdb 打开核心转储(但您需要 -g)。
如果前面所有使用调试 (-g) 编译并在调试器 (gdb, run, bt) 下运行的建议都不适合您,那么:
core
运行 gdb 时添加第三个参数 ( ),否则会以相同的状态启动,不附加到任何特定进程或内存映像。-fstack-protector-all
. 它可以通过补丁添加到 GCC 3.x。GCC 无法提供此信息,您必须依赖外部程序,例如 GDB。
GDB 可以在程序出现段错误后使用“bt”(“backtrace”的缩写)命令为您提供发生崩溃的行。这不仅会为您提供崩溃的行,还会为您提供程序的整个堆栈(因此您可以看到发生崩溃的函数调用了什么)。
当No stack
程序成功退出时,问题似乎发生了。
作为记录,我遇到了这个问题,因为我忘记了代码中的返回,这使我的程序退出并显示失败代码。