如果Linux出现段错误,您能否在Linux中获得任何程序来打印堆栈跟踪?


20

如果我从外壳运行程序,则它会出现段错误:

$ buggy_program
Segmentation fault

它会告诉我,有没有一种方法可以让程序打印回溯记录,也许可以通过运行以下命令来实现:

$ print_backtrace_if_segfault buggy_program
Segfault in main.c:35
(rest of the backtrace)

我也不想将strace或ltrace用于此类信息,因为它们将以两种方式打印...

Answers:


25

也许有更好的方法,但是这种方法可以自动化。

将以下内容放入~/backtrace

backtrace
quit

将其放入seg_wrapper.sh路径中目录中称为的脚本中:

#!/bin/bash
ulimit -c unlimited
"$@"
if [[ $? -eq 139 ]]; then
    gdb -q $1 core -x ~/backtrace
fi

ulimit命令可以使核心转储。"$@"是提供给脚本的参数,因此它将是您的程序及其参数。$?保留退出状态,139似乎是我的段故障机器的默认退出状态。

对于gdb-q表示安静(无介绍性消息),并-x告诉gdb执行指定给它的文件中的命令。

用法

因此,要使用它,您将:

seg_wrapper.sh ./mycommand and its arguments 

更新资料

您也可以编写一个执行此操作的信号处理程序,请参阅此链接


2
您与信号处理程序解决方案的链接已死-这就是为什么答案不应该链接至其他资源的原因…
josch 2014年

1
您可能是说“ -x告诉gdb执行”,而不是“ -x告诉gdb退出”
josch 2014年

19

抱歉两年后才来到这里...在寻找其他东西时偶然发现。添加此内容是为了完整性。

1)虽然我认为公认的答案很好,但它需要gdb。我熟悉的方法使用libSegFault.so。

如果您使用

LD_PRELOAD = ...路径... / libSegFault.so myapp

您将获得包含回溯,加载的库等的报告

2)catchsegv还提供了包装器脚本,该脚本将尝试addr2line用于将地址转换为文件名+行号。

这些解决方案比核心文件或gdb轻巧得多(例如,适用于嵌入式系统)


实际上,LD_PRELOAD=libSegFault.so如果它在dl路径中就可以了。
Fernando Silveira 2014年

1
@FernandoSilveira好的。用这种方式写出的答案提示读者,他们应该检查该路径是什么。
nhed 2014年

6

您需要每个人的朋友GDB

gdb <program> [core file]

加载核心文件后,命令“ backtrace”(可以缩写为bt)将为您提供当前的调用堆栈。如果从gdb内部运行程序,则可以设置任意断点并检查内存内容等。


有没有办法只打印回溯并退出?
尼尔

5

catchsegv

它是在另一个答案中提到的(但绝不是重点)。这是与glibc项目捆绑在一起的便捷工具。仅当程序确实存在段错误时,它才会提供回溯(以及其他有用的调试信息)。

这里有不错的文章。

您可以根据需要将其包含在自己的脚本中。



2

这是来自Kyle Brandt的脚本的略微修改的变体。通过以下方式对其进行了改进:

  • 如果堆栈跟踪很长,则不需要手动交互
  • 某些核心转储使用名称模式核心保存。请遵守此设置
  • 不需要为gdb飞来飞去的显式命令文件(它将创建一个临时文件)
  • 等待后台作业

脚本:

#!/bin/bash
gdbcommandfile=$(tempfile)
usepid=$(cat /proc/sys/kernel/core_uses_pid)
printf "set pagination off\nbacktrace\nquit\n" > $gdbcommandfile
ulimit -c unlimited
"$@"&
pid=$!
wait $!
if [[ $? -eq 139 ]]; then
    if [[ $usepid == 1 ]]; then 
        gdb -q $1 core.$pid -x $gdbcommandfile
    else
        gdb -q $1 core -x $gdbcommandfile
    fi
fi
rm $gdbcommandfile

1
对于一连串这样简单的命令,我只会使用它-exgdb ... -ex 'set pagination off' -ex backtrace -ex quit
乔什·斯通
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.