我正在分析一套有缺陷的程序,在某些测试下,它们可能会以分段故障终止。分段错误事件记录在/var/log/syslog中。
例如,下面的代码片段返回Segmentation fault并将其记录下来。
#!/bin/bash
./test我的问题是如何抑制分段错误,使其不会出现在系统日志中。我尝试使用trap来捕获以下脚本中的信号:
#!/bin/bash
set -bm
trap "echo 'something happened'" {1..64}
./test它返回:
Segmentation fault
something happened因此,它确实捕获了分段故障,但仍然记录了分段故障。
kernel: [81615.373989] test[319]: segfault at 0 ip 00007f6b9436d614
sp 00007ffe33fb77f8 error 6 in libc-2.19.so[7f6b942e1000+1bb000]发布于 2016-01-26 04:29:39
您可以尝试将./test更改为以下行:
. ./test这将在同一个shell中执行./test。
发布于 2016-03-31 08:33:08
例如,我们可以在整个日志信息系统范围内抑制日志消息系统。
echo 0 >/proc/sys/debug/exception-trace如果我们在ptrace()控制下运行日志消息(就像在调试器中那样),我们可以抑制单个进程的日志消息。这个程序是这样做的:
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;
}在您的例子中,它是以buggy程序作为其参数调用的。
exe ./testexe的退出状态通常是test的退出状态,但如果test被信号n (11用于分段故障)终止,则为128+n。写完这篇文章之后,我意识到我们也可以使用strace来达到这个目的。
strace -enone ./testhttps://stackoverflow.com/questions/35006046
复制相似问题