我可以设置任何gcc选项,它会给我分段错误的行号吗?
我知道我可以:
逐行调试
将printfs放入代码中以缩小范围.
编辑:
bt
/ where
在gdb上给出无堆栈.
有用的建议
rck.. 64
我不知道gcc选项,但你应该能够使用gdb运行应用程序,然后当它崩溃时,键入where
以查看退出时的堆栈,这应该让你关闭.
$ gdb blah (gdb) run (gdb) where
编辑完整性:
您还应该确保使用-g
gcc选项构建带有调试标志的应用程序,以在可执行文件中包含行号.
另一种选择是使用bt
(backtrace)命令.
我不知道gcc选项,但你应该能够使用gdb运行应用程序,然后当它崩溃时,键入where
以查看退出时的堆栈,这应该让你关闭.
$ gdb blah (gdb) run (gdb) where
编辑完整性:
您还应该确保使用-g
gcc选项构建带有调试标志的应用程序,以在可执行文件中包含行号.
另一种选择是使用bt
(backtrace)命令.
这是一个完整的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...
快乐的黑客:-)
当程序获得SEGV信号时,您可以让gcc为您打印堆栈跟踪,类似于Java和其他更友好的语言处理空指针异常的方式.有关详细信息,请参阅我的答案:
我的C++应用程序崩溃时如何生成堆栈(使用gcc编译器)
关于这个的好处是你可以把它留在你的代码中; 你不需要通过gdb运行以获得良好的调试输出.
如果使用-g进行编译并按照其中的说明进行操作,则可以使用addr2line之类的命令行工具从输出中获取文件/行信息.
在valgrind下运行它.