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


10

我有一个bash脚本,用于测试某些程序,并且其中一个程序返回,Segmentation fault因此我尝试在脚本的开头添加一个陷阱:

trap "echo 'segfault occured!'" SIGSEGV

但是那什么也没做。我用了

echo $?

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

Answers:


7

trap "$instructions" SIGSEGV 将分段错误捕获在外壳本身中。

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

set -e
trap 'case $? in
        139) echo "segfault occurred";;
      esac' EXIT

在bash或ksh或zsh中,不需要set -e在每个返回非零状态的命令之后执行陷阱,ERR而可以放一个陷阱。和以前一样,您需要检查$?陷阱的输入,并且139可以(但很少这样做)表示程序返回了此状态。


6

来自man bash

   trap [-lp] [[arg] sigspec ...]
          The command arg is to  be  read  and  executed  when  the  shell
          receives  signal(s)  sigspec.

当程序出现段故障时,SIGCHLD由于某些孩子退出(以任何方式),bash只会得到a 。

不过,您可以使用存储在中的退出码$?(在某些条件下)和陷阱SIGCHLD

trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD

请注意,set -bm如果在非交互式bash(例如脚本)中使用此功能(可能的功能),则可能需要这样做。

编辑:另请参阅此(Gilles)关于使用bash和的类似问题的答案trap


发生了一些奇怪的事情。我使用陷阱trap "echo 'something happened!'" {1..64},但仍然什么也没得到。我什至尝试过set -bmset -o monitor但纳达。
Pithikos 2011年

您是否以交互方式尝试过?trap "echo 'something happened'" {1..31}为我工作(省去了!和导致的信号规范bash: trap: XX: invalid signal specification)。
sr_
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.