ptrace'ing 时子进程不继续执行

标签 c linux debugging ptrace

我制作了以下简单示例以使用 ptrace 从子进程读取内存。

我想在执行小型矩阵乘法程序期间每秒查看特定地址 0x601050 处的值。我使用 PTRACE_PEEKDATA,然后使用 PTRACE_CONT,并在无限循环中休眠 1 秒。

然而,矩阵乘法程序永远不会继续——它应该在第一条指令中打印到标准输出,但它似乎永远不会执行。我知道 ptrace(PTRACE_CONT,pid) 会向 child 发出恢复执行的信号,而 sleep(1) 会允许它执行一秒钟(直到下一次 ptrace 调用),但事实并非如此。

#include <string.h>
#include <errno.h>
#include <inttypes.h>

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

int read_mem(long *out, pid_t pid, long addr, size_t sz)
{
    long tmp;
    size_t copied = 0;

    while(copied < sz)
    {
        tmp = ptrace(PTRACE_PEEKDATA, pid, addr+copied);

        if(errno)
        { 
            fprintf(stderr,"ptrace: error : %s\n",strerror(errno));
            return copied;
        }

        memcpy(out,&tmp,sizeof(long));

        copied += sizeof(long);
        out++;

        printf("ptrace: copied %d bytes\n",copied);
    }

    return copied;
}

int main()
{   
    pid_t child;
    long result;
    struct user_regs_struct regs;
    int status;

    long addr = 0x601050;
    size_t sz = sizeof(double);
    long *buf = (long*)malloc(sz);

    child = fork();

    if(child == 0) 
    {
        ptrace(PTRACE_TRACEME);
        execl("./matmul", "matmul", NULL);
    }
    else 
    {
        ptrace(PTRACE_GETREGS, child, &regs);
        printf("ptrace: regs.rip : 0x%lx\n", regs.rip);

        while(1)
        {
            read_mem(buf, child, addr, sz);
            printf("ptrace: read(0x%lx) : %f\n", addr, (double)(*buf));

            ptrace(PTRACE_CONT, child);

            sleep(1);
        }
    }
    return 0;
}

最佳答案

您似乎没有设置 PTRACE_O_TRACEEXEC 选项。如果不这样做会导致在调用 exec 时将 SIGTRAP 发送给 tracee;如果未准备好,则默认操作是使用核心转储终止。

关于ptrace'ing 时子进程不继续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26567693/

相关文章:

objective-c - 在 macOS 上的另一个线程中设置线程的名称

c++ - SVN repo http ://server/. ../和 svn ://server/. ./有什么区别

c++ - Linux:获取孙子的 pid C++

linux - client connect()先于server accept()成功,client如何知道server accept()成功呢?

eclipse - 使用 Eclipse 在 PyDev 中调试的快捷方式是什么

python - 如何在 Debug模式下运行fastapi项目在vscode中自动重新加载

java - 在java中获取调用的方法堆栈

c++ - 为什么多线程更慢?

c - 在缓冲区中高效地查找序列

c - 如何修复 C 中的自定义 insertString 函数