如果我从 shell 运行一个程序,它会出现段错误:
$ buggy_program
Segmentation fault
然而,它会告诉我,有没有办法让程序打印回溯,也许是通过运行这样的东西:
$ print_backtrace_if_segfault buggy_program
Segfault in main.c:35
(rest of the backtrace)
我也不想使用 strace 或 ltrace 来获取这类信息,因为它们会以任何一种方式打印......
如果我从 shell 运行一个程序,它会出现段错误:
$ buggy_program
Segmentation fault
然而,它会告诉我,有没有办法让程序打印回溯,也许是通过运行这样的东西:
$ print_backtrace_if_segfault buggy_program
Segfault in main.c:35
(rest of the backtrace)
我也不想使用 strace 或 ltrace 来获取这类信息,因为它们会以任何一种方式打印......
可能有更好的方法,但是这种方法可以自动化。
将以下内容放入
~/backtrace
:seg_wrapper.sh
将其放入路径中目录中调用的脚本中:该
ulimit
命令使核心被转储。"$@"
是给脚本的参数,所以它是你的程序和它的参数。$?
保持退出状态,139 似乎是我的机器的默认退出状态,用于段错误。对于
gdb
,-q
意味着安静(没有介绍消息),并-x
告诉gdb
执行给它的文件中的命令。用法
因此,要使用它,您只需:
更新
您还可以编写一个信号处理程序来执行此操作,请参阅此链接。
很抱歉两年后来到这里......在寻找其他东西时偶然发现。添加这个是为了完整性。
1)虽然我认为接受的答案很好,但它需要 gdb。我熟悉的方法使用libSegFault.so。
如果你运行你的应用程序
你会得到一个带有回溯、加载的库等的报告
2) 还提供了一个包装脚本
catchsegv
,它可以尝试addr2line
将地址转换为文件名 + 行号。这些解决方案比核心文件或 gdb 轻得多(例如,适用于嵌入式系统)
赶路
在另一个答案中提到了它(但绝不集中在)。这是一个与 glibc 项目捆绑在一起的方便工具。只有当程序确实存在段错误时,它才会提供回溯(和其他有用的调试信息) 。
这里有一篇好文章。
您可以根据需要将其包含在您自己的脚本中。
你需要每个人的朋友 GDB
一旦你加载了你的核心文件,命令'backtrace'(可以缩写为bt)会给你当前的调用堆栈。如果从 gdb 内部运行程序,则可以设置任意断点并检查内存内容等。
Ubuntu(作为一个项目)使用 Appor 来做到这一点。你可以看看他们是怎么做到的。
https://wiki.ubuntu.com/Apport
这是 Kyle Brandt 脚本的一个稍微修改过的变体。它通过以下方式进行改进:
脚本: