Linux 抑制SEG故障信号

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

我正在分析一组有缺陷的程序,在某些测试中,它们可能会以segfault终止。segfault事件记录在
/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