我有一个 bash 脚本来测试一些程序,其中一个程序返回,Segmentation fault
所以我尝试在脚本的头部添加一个陷阱:
trap "echo 'segfault occured!'" SIGSEGV
然而这并没有起到任何作用。我用了
echo $?
就在产生段错误的程序之后,我得到139作为输出。如何为该特定错误代码添加陷阱?
答案1
trap "$instructions" SIGSEGV
捕获 shell 本身的分段错误。
如果您在 下运行脚本,则可以在(或)set -e
上放置陷阱。它将在脚本终止时执行(无论是由于命令返回非零状态,还是通过显式调用或脱离脚本末尾)。要测试分段错误,请检查陷阱的入口。 (请注意,可能是 139,因为程序正常返回,状态为 139;如果您在 shell 中进行处理,这是可以避免的。)EXIT
0
exit
$?
$?
set -e
trap 'case $? in
139) echo "segfault occurred";;
esac' EXIT
在 bash 或 ksh 或 zsh 中,您不需要set -e
在每个返回非零状态的命令后执行陷阱,您可以改为放置陷阱ERR
。和以前一样,您需要检查$?
陷阱的入口,139 可以(但很少)意味着程序返回了此状态。
答案2
从man bash
:
trap [-lp] [[arg] sigspec ...]
The command arg is to be read and executed when the shell
receives signal(s) sigspec.
当你的程序出现段错误时,你的 bash 就会SIGCHLD
因为某个孩子退出(以任何方式)而得到 a 。
$?
但是,您可以使用存储在、某些条件和 trap 中的退出代码SIGCHLD
:
trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD
请注意,set -bm
如果在非交互式 bash(例如脚本)中使用此功能(它可能执行的操作),则可能需要这样做。
编辑:也可以看看这个(吉尔斯)的答案在类似的问题上使用bash
和trap
。