【问题标题】:Suppressing the segfault signal抑制段错误信号
【发布时间】:2016-01-26 02:21:28
【问题描述】:

我正在分析一组有缺陷的程序,在某些测试下它们可能会因段错误而终止。段错误事件记录在/var/log/syslog

例如下面的 sn -p 返回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]

【问题讨论】:

  • 您的 shell 脚本可能会收到一个 SIGCHLD。 SIGSEGV 被执行./test的子shell接收到

标签: linux bash segmentation-fault signals


【解决方案1】:

您可以尝试将./test更改为以下行:

. ./test

这将在同一个 shell 中执行 ./test

【讨论】:

    【解决方案2】:

    我们可以使用 e 在系统范围内抑制日志消息。 g.

    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;
    }
    

    在你的情况下,它以错误程序作为参数调用

    exe ./test
    

    - 那么exe 的退出状态通常是test 的退出状态,但是如果test 被信号n 终止(11 表示分段错误),它是 128+n

    写完之后,我意识到我们也可以使用strace 来达到目的,例如。 g.

    strace -enone ./test
    

    【讨论】:

      猜你喜欢
      • 2018-10-11
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多