分段错误的行号
有没有我可以设置的gcc选项,会给我分段错误的行号?
我知道我可以:
- 逐行debugging
- 将printfs放在代码中以缩小范围。
编辑:
-
bt
/在GDB上给没有堆栈。 - 有用的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,我有这个问题,因为我已经忘记了在我的代码返回,这使我的程序退出失败代码。