分段错误的行号

有没有我可以设置的gcc选项,会给我分段错误的行号?

我知道我可以:

  1. 逐行debugging
  2. 将printfs放在代码中以缩小范围。

编辑:

  1. bt /在GDB上给没有堆栈。
  2. 有用的build议

我不知道gcc选项,但是你应该可以使用gdb运行应用程序,然后当它崩溃的时候,键入到什么where看看堆栈,当它退出时,应该让你closures。

 $ gdb blah (gdb) run (gdb) where 

编辑完整性:

您还应该确保使用-g gcc选项在可执行文件中包含行号,并使用debugging标志构build应用程序。

另一个select是使用bt (backtrace)命令。

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

 $ gcc -ggdb myproj.c
 $ gdb a.out
 gdb> run --some-option = foo --other-option = bar
 (gdb会说你的程序碰到段错误)
 gdb> bt
 (gdb打印一个堆栈跟踪)
 gdb> q
 [你确定,你的程序还在运行中]?  ÿ
 $ emacs myproj.c#嘿,我知道现在的错误是什么...

快乐黑客:-)

当程序得到一个SEGV信号时,可以让gcc打印一个堆栈跟踪,就像Java和其他友好的语言处理空指针exception一样。 在这里看到我的答案更多的细节:

  • 当我的C ++应用程序崩溃时如何生成堆栈(使用gcc编译器)

关于这一点的好处是你可以把它留在你的代码中; 你不需要通过gdb运行的东西来获得漂亮的debugging输出。

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

在valgrind下运行。

你还需要在-g上创builddebugging标志

你也可以用gdb打开核心转储(你需要-g)。

如果所有前面提到的使用debugging(-g)进行编译并在debugging器(gdb,run,bt)下运行的build议不适用于您,则:

  • 小学:也许你没有在debugging器下运行,你只是试图分析事后核心转储。 (如果你开始一个debugging会话,但不运行程序,或者如果退出,那么当你要求回溯时,gdb会说“没有堆栈” – 因为根本没有正在运行的程序。键入“run”。)如果它被隔离了,不要忘记在运行gdb时添加第三个参数( core ),否则以相同的状态启动,而不是附加到任何特定的进程或内存映像。
  • 困难:如果你的程序是/正在运行,但你的gdb说“没有堆栈”,也许你的堆栈指针被严重砸碎。 在这种情况下,您可能会遇到缓冲区溢出问题,严重到足以混淆您的运行时状态。 GCC 4.1支持使用-fstack-protector-all启用的ProPolice“Stack Smashing Protector”。 它可以通过补丁添加到GCC 3.x中。

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

在程序发生seg故障后,GDB可以给出发生崩溃的行,并带有“bt”(简称“backtrace”)命令。 这不仅会给你崩溃的一行,而且会给你整个程序堆栈(所以你可以看到发生崩溃的函数)。

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

为了logging,我有这个问题,因为我已经忘记了在我的代码返回,这使我的程序退出失败代码。