当前位置:  开发笔记 > 开发工具 > 正文

分段错误的行号

如何解决《分段错误的行号》经验,为你挑选了4个好方法。

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

我知道我可以:

    逐行调试

    将printfs放入代码中以缩小范围.

编辑:

    bt/ where在gdb上给出无堆栈.

    有用的建议

rck.. 64

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

$ gdb blah
(gdb) run
(gdb) where

编辑完整性:

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

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



1> rck..:

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

$ gdb blah
(gdb) run
(gdb) where

编辑完整性:

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

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


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

2> Jonas Kölker..:

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

快乐的黑客:-)


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

3> Todd Gamblin..:

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

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

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

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



4> anonnn..:

在valgrind下运行它.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有