Linux 抑制SEG故障信号
我正在分析一组有缺陷的程序,在某些测试中,它们可能会以segfault终止。segfault事件记录在Linux 抑制SEG故障信号,linux,bash,segmentation-fault,signals,Linux,Bash,Segmentation Fault,Signals,我正在分析一组有缺陷的程序,在某些测试中,它们可能会以segfault终止。segfault事件记录在/var/log/syslog中 例如,以下代码段返回分段错误,并记录下来 #!/bin/bash ./test 我的问题是如何抑制segfault,使其不会出现在系统日志中。我尝试在以下脚本中捕获信号: #!/bin/bash set -bm trap "echo 'something happened'" {1..64} ./test 它返回: Segmenta
/var/log/syslog
中
例如,以下代码段返回分段错误
,并记录下来
#!/bin/bash
./test
我的问题是如何抑制segfault,使其不会出现在系统日志中。我尝试在以下脚本中捕获信号:
#!/bin/bash
set -bm
trap "echo 'something happened'" {1..64}
./test
它返回:
Segmentation fault
something happened
因此,它确实会捕获SEGFULT,但仍会记录SEGFULT
您可以尝试将
/test
更改为以下行:
. ./test
这将在同一个shell中执行
/test
。您可以尝试将/test
更改为以下行:
. ./test
这将在同一个shell中执行
/test
。我们可以使用e在系统范围内抑制日志消息。g
echo 0 >/proc/sys/debug/exception-trace
-另见
如果像在调试器中一样在控制下运行单个进程,则可以抑制该进程的日志消息。该程序的作用是:
exe.c
#include <sys/wait.h>
#include <sys/ptrace.h>
main(int argc, char *args[])
{
pid_t pid;
if (*++args)
if (pid = fork())
{
int status;
while (wait(&status) > 0)
{
if (!WIFSTOPPED(status))
return WIFSIGNALED(status) ? 128+WTERMSIG(status)
: WEXITSTATUS(status);
int signal = WSTOPSIG(status);
if (signal == SIGTRAP) signal = 0;
ptrace(PTRACE_CONT, pid, 0, signal);
}
perror("wait");
}
else
{
ptrace(PTRACE_TRACEME, 0, 0, 0);
execvp(*args, args);
perror(*args);
}
return 1;
}
-然后exe
的退出状态通常是test
的退出状态,但如果test
被信号n终止(11表示分段故障),则为128+n
在我写了这篇文章之后,我意识到我们也可以使用strace
来达到这个目的。g
strace -enone ./test
我们可以使用e在系统范围内抑制日志消息。g
echo 0 >/proc/sys/debug/exception-trace
-另见
如果像在调试器中一样在控制下运行单个进程,则可以抑制该进程的日志消息。该程序的作用是:
exe.c
#include <sys/wait.h>
#include <sys/ptrace.h>
main(int argc, char *args[])
{
pid_t pid;
if (*++args)
if (pid = fork())
{
int status;
while (wait(&status) > 0)
{
if (!WIFSTOPPED(status))
return WIFSIGNALED(status) ? 128+WTERMSIG(status)
: WEXITSTATUS(status);
int signal = WSTOPSIG(status);
if (signal == SIGTRAP) signal = 0;
ptrace(PTRACE_CONT, pid, 0, signal);
}
perror("wait");
}
else
{
ptrace(PTRACE_TRACEME, 0, 0, 0);
execvp(*args, args);
perror(*args);
}
return 1;
}
-然后exe
的退出状态通常是test
的退出状态,但如果test
被信号n终止(11表示分段故障),则为128+n
在我写了这篇文章之后,我意识到我们也可以使用strace
来达到这个目的。g
strace -enone ./test
您的shell脚本可能会收到一个SIGCHLD。SIGSEGV由执行
/test
的子shell接收。您的shell脚本可能会收到一个SIGCHLD。执行/test