如何在 bash 中捕获返回 139(分段错误)的程序?

如何在 bash 中捕获返回 139(分段错误)的程序?

我有一个 bash 脚本来测试一些程序,其中一个程序返回,Segmentation fault所以我尝试在脚本的头部添加一个陷阱:

trap "echo 'segfault occured!'" SIGSEGV

然而这并没有起到任何作用。我用了

echo $?

就在产生段错误的程序之后,我得到139作为输出。如何为该特定错误代码添加陷阱?

答案1

trap "$instructions" SIGSEGV捕获 shell 本身的分段错误。

如果您在 下运行脚本,则可以在(或)set -e上放置陷阱。它将在脚本终止时执行(无论是由于命令返回非零状态,还是通过显式调用或脱离脚本末尾)。要测试分段错误,请检查陷阱的入口。 (请注意,可能是 139,因为程序正常返回,状态为 139;如果您在 shell 中进行处理,这是可以避免的。)EXIT0exit$?$?

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(例如脚本)中使用此功能(它可能执行的操作),则可能需要这样做。

编辑:也可以看看这个(吉尔斯)的答案在类似的问题上使用bashtrap

相关内容