分段错误的行数

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 exitb _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问题似乎是程序成功退出时出现的。

为了记录,我遇到了这个问题,因为我忘记了代码中的返回,这使我的程序退出并显示失败代码。

【讨论】:

以上是关于分段错误的行数的主要内容,如果未能解决你的问题,请参考以下文章

为啥解释计划显示错误的行数?

部分错误Swift中的行数

数据表中的错误:无法显示正确的行数

错误:iPhone SDK 中 UITableView 部分中的行数

python中CSV文件的行数错误

组上的 MySQL COUNT() 返回错误的行数