读取另一个进程的堆栈?

use*_*537 17 linux kernel memory proc

我正在尝试读取子进程的堆栈,但没有运气。我知道可以使用ptrace,但是ptrace的界面允许您一次只读取一个单词,我正在尝试扫描堆栈的更大部分。

我还尝试在首先使用 ptrace 附加到文件后/proc/$pid/mem/proc/$pid/maps文件中提取的堆栈边界读取(如建议here),但读取一直失败(即使以 root 身份运行),尽管相同的代码在尝试时成功从进程的不同部分(例如堆)读取。

我究竟做错了什么?还有其他选择吗?

sam*_*var 5

ptrace的界面允许您一次只阅读一个单词,我正在尝试扫描堆栈的更大部分

那么,只需使用循环。老实说,我不明白这对 有什么影响ptrace,我一直使用它来远程访问进程。

我使用这样的东西:

static int memcpy_from_target(pid_t pid, char *dest, long src, size_t n)
{
    static int const align = sizeof(long) - 1;

    while (n)
    {
        size_t todo = MIN(n, sizeof(long) - (src & align));
        long data = ptrace(PTRACE_PEEKTEXT, pid, src - (src & align), 0);
        if (errno)
        {
            perror("ptrace_peektext (memcpy_from_target)");
            return -1;
        }
        memcpy(dest, (char *)&data + (src & align), todo);

        dest += todo; src += todo; n -= todo;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)