分段错误的行数
Posted
技术标签:
【中文标题】分段错误的行数【英文标题】:Line number of segmentation fault 【发布时间】:2010-10-05 01:31:19 【问题描述】:我可以设置任何 gcc 选项来提供分段错误的行号吗?
我知道我可以:
-
逐行调试
将 printfs 放入代码中以缩小范围。
编辑:
bt
/ where
在 gdb 上不提供堆栈。
Helpful suggestion
【问题讨论】:
你能发布你的编译器标志吗? gcc -DDEBUG -I"" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP (下一次,请将您的代码放入您的问题中)。 我也试过了,但不是我的所有代码,实际上,找到代码的相关部分是我的问题。 Determine the line of code that causes a segmentation fault?的可能重复 【参考方案1】:我不知道 gcc 选项,但是您应该能够使用 gdb 运行应用程序,然后当它崩溃时,键入 where
以查看堆栈退出时,这应该可以让您关闭.
$ gdb blah
(gdb) run
(gdb) where
为了完整性而编辑:
您还应该确保使用-g
gcc 选项在可执行文件中包含行号时使用调试标志构建应用程序。
另一种选择是使用bt
(回溯)命令。
【讨论】:
一些崩溃可能会损坏 stact 内容,然后您最好插入 printf 并检查各个代码点的输入有效性。 你也可以试试我下面的建议——它使用 glibc 的堆栈展开例程来打印出堆栈跟踪,而无需求助于 gdb。 我觉得这很有用:gnu.org/software/gcc/bugs/segfault.html【参考方案2】:这是一个完整的 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 # 呵呵,我现在知道错误是什么了...黑客愉快:-)
【讨论】:
bt 和 where 给出“无堆栈”。我该如何解决? 你在我的电脑上运行它;-) [对不起] 可能是因为您使用的是 Windows,它在分段错误时退出程序。在这种情况下,b exit
或 b _exit
都可以。【参考方案3】:
当您的程序收到 SEGV 信号时,您可以让 gcc 为您打印堆栈跟踪,类似于 Java 和其他更友好的语言处理空指针异常的方式。有关详细信息,请在此处查看我的答案:
how to generate a stacktace when my C++ app crashes ( using gcc compiler )这样做的好处是你可以把它留在你的代码中;您无需通过 gdb 运行即可获得不错的调试输出。
如果您使用 -g 编译并按照那里的说明进行操作,则可以使用addr2line 等命令行工具从输出中获取文件/行信息。
【讨论】:
链接失效了...更正的是:***.com/questions/77005/…【参考方案4】:在 valgrind 下运行。
【讨论】:
【参考方案5】:您还需要在 -g 上使用调试标志进行构建
您也可以使用 gdb 打开核心转储(但您需要 -g)。
【讨论】:
Brulak 很准确,如果您没有在 gdb 中获得堆栈,则需要修复您的符号【参考方案6】:如果前面所有使用调试 (-g) 编译并在调试器 (gdb, run, bt) 下运行的建议都不适合您,那么:
初级:也许您没有在调试器下运行,您只是在尝试分析事后核心转储。 (如果您启动调试会话,但不运行程序,或者如果程序退出,那么当您要求回溯时,gdb 会说“No stack”——因为根本没有正在运行的程序。不要忘记键入“run”。)如果出现段错误,请不要忘记在运行 gdb 时添加第三个参数(core
),否则您将以相同的状态启动,不附加到任何特定的进程或内存映像。李>
困难:如果您的程序正在运行,但您的 gdb 显示“无堆栈”,则您的堆栈指针可能已严重损坏。在这种情况下,您可能在某个地方出现缓冲区溢出问题,严重到足以完全混合您的运行时状态。 GCC 4.1 支持使用-fstack-protector-all
启用的 ProPolice“堆栈粉碎保护器”。它可以通过补丁添加到 GCC 3.x。
【讨论】:
【参考方案7】:GCC 无法提供此信息,您必须依赖外部程序,例如 GDB。
GDB 可以在程序出现段错误后使用“bt”(“backtrace”的缩写)命令为您提供发生崩溃的行。这不仅会为您提供崩溃的行,还会为您提供程序的整个堆栈(这样您就可以看到发生崩溃的函数调用了什么)。
【讨论】:
【参考方案8】:No stack
问题似乎是程序成功退出时出现的。
为了记录,我遇到了这个问题,因为我忘记了代码中的返回,这使我的程序退出并显示失败代码。
【讨论】:
以上是关于分段错误的行数的主要内容,如果未能解决你的问题,请参考以下文章