0

我正在尝试监视子进程是否存在段错误错误,但这不起作用。

我总是收到 ABRT 信号。

我看到 gdb 可以捕获段错误,那么我的代码有什么问题?

        pid_t child;
        int wstatus, signum;
        struct user_regs_struct regs;

        child = fork();
        if (child == 0)
        {
                ptrace(PTRACE_TRACEME, 0, NULL, NULL);
                char buf[10];
                // make it always crash
                strcpy (buf, "aaaaaaabbbbbbbbbbbaaaaaaaaaaaaaaaa");
                printf ("Buf is %s\n", buf);

                exit(0);
        }

        while(1)
        {
                wait(&wstatus);
                if (WIFEXITED(wstatus) || WIFSIGNALED(wstatus))
                        break;

                signum = WSTOPSIG(wstatus);
                ptrace(PTRACE_GETREGS, child, NULL, &regs);

                printf ("signal: %d, eip: 0x%08lx\n", signum, regs.eip);
                ptrace(PTRACE_CONT, child, NULL, signum);
        }
4

1 回答 1

2

我的代码有什么问题

WIFSIGNALED当孩子收到信号 ( )时,您的代码会跳出循环。由于您期望捕获信号(最有可能SIGSEGV),也许您不应该在孩子收到信号时跳出循环?

我又看了你的代码。目前尚不清楚您的孩子为什么会崩溃也许您正在使用-fstack-protector或类似的方式构建它?

这是一个完整的可编译测试用例(您应该将其放入您的问题中),它确实会崩溃(注意:exit从子项中删除):

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>
#include <sys/ptrace.h>
#include <sys/user.h>

int main()
{
    pid_t child;
    int wstatus, signum;
    struct user_regs_struct regs;

    child = fork();
    if (child == 0)
    {
        ptrace(PTRACE_TRACEME, 0, NULL, NULL);
        char buf[10];
        // make it always crash
        strcpy (buf, "aaaaaaabbbbbbbbbbbaaaaaaaaaaaaaaaa");

        printf ("Buf is %s\n", buf);
    }

    while(1)
    {
        wait(&wstatus);
        if (WIFEXITED(wstatus))
            break;

        signum = WSTOPSIG(wstatus);
        ptrace(PTRACE_GETREGS, child, NULL, &regs);

        printf ("signal: %d, eip: 0x%08lx\n", signum, regs.eip);
        ptrace(PTRACE_CONT, child, NULL, signum);
    }
    return wstatus;
}

并得到了无限循环

您通常应该得到一个无限循环:您正在恢复孩子,它重新执行其当前指令,这应该再次触发完全相同的信号。

不过,我的系统上的上述程序并没有发生这种情况,我目前无法解释我所观察到的情况:

$ ./a.out
Buf is aaaaaaabbbbbbbbbbbaaaaaaaaaaaaaaaa
signal: 159, eip: 0x08049ff4
signal: 159, eip: 0x08049ff4
...
signal: 159, eip: 0x08049ff4
*** stack smashing detected ***: ./a.out terminated
signal: 11, eip: 0xf759fb19
signal: 0, eip: 0xf759fb19
signal: 0, eip: 0xf759fb19
...
于 2013-04-30T04:38:11.270 回答