Linux C ++ ptrace - 映射子进程内存的所有单元格

时间:2012-04-14 22:07:22

标签: c++ linux memory ptrace

我有一个类似的链接列表:

class MemoryCell
{
protected:
    unsigned char* _address; // the address offset (in another process)
    unsigned int _size;  // the size of this memory block
    unsigned char* _buffer; // the data

    MemoryCell* _next; // points to next memory cell to form linked list
};

然后我有一个MemoryMapper课程,它会占据头部。我想把所有的存储单元都放进去。

// void MemoryMapper::MapAllCells(unsigned int procId)//
unsigned int offset = 0x0;
while (true)
    {
        long memoryData = ptrace(PTRACE_PEEKDATA, procId, offset);
        if (memoryData == -1) break; // need to check for errno(3) too
       // add new MemoryCell w/ data to head of linked list
       // how to get next offset based on what was returned?

它立即在地址0处断开。我认为它可能从0x0开始,但我想我需要真正的偏移量。但是如何获得下一个偏移量(基于之前的大小)?

希望很清楚,但如果需要,我可以澄清谢谢

1 个答案:

答案 0 :(得分:0)

您无法从ptrace()获取此信息;但是,您可以从/proc/PID/maps获取子进程。请注意,地址0通常不会映射,以便捕获NULL指针引用,并且可能对PTRACE_PEEKDATA没有意义(这些天通常不使用单独的I和D,并且在它缺席的地址0通常是文本,而不是数据;内核是否难以区分,我不知道我的头脑。)