Answers:
也许有更好的方法,但是这种方法可以自动化。
将以下内容放入~/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
您也可以编写一个执行此操作的信号处理程序,请参阅此链接。
抱歉两年后才来到这里...在寻找其他东西时偶然发现。添加此内容是为了完整性。
1)虽然我认为公认的答案很好,但它需要gdb。我熟悉的方法使用libSegFault.so。
如果您使用
LD_PRELOAD = ...路径... / libSegFault.so myapp
您将获得包含回溯,加载的库等的报告
2)catchsegv
还提供了包装器脚本,该脚本将尝试addr2line
用于将地址转换为文件名+行号。
这些解决方案比核心文件或gdb轻巧得多(例如,适用于嵌入式系统)
LD_PRELOAD=libSegFault.so
如果它在dl路径中就可以了。
Ubuntu(作为一个项目)使用Apport来做到这一点。您可以看看他们是如何做到的。
/proc/sys/kernel/core_pattern
这是来自Kyle Brandt的脚本的略微修改的变体。通过以下方式对其进行了改进:
#!/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
-ex
。 gdb ... -ex 'set pagination off' -ex backtrace -ex quit