分段错误的行号

Roh*_*hit 47 debugging gcc gdb segmentation-fault

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

我知道我可以:

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

编辑:

  1. bt/ where在gdb上给出无堆栈.
  2. 有用的建议

rck*_*rck 64

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

$ gdb blah
(gdb) run
(gdb) where
Run Code Online (Sandbox Code Playgroud)

编辑完整性:

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

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

  • 你也可以尝试下面的建议 - 它使用glibc的堆栈展开例程打印出一个不需要诉诸gdb的堆栈跟踪. (2认同)

Jon*_*ker 21

这是一个完整的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...

快乐的黑客:-)

  • 你在我的电脑上运行它;-) [对不起] (7认同)
  • bt和哪里给出"没有堆栈".我该如何解决这个问题? (3认同)

Tod*_*lin 10

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

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

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


ano*_*nnn 7

在valgrind下运行它.