【问题标题】:Difference between ptrace(PTRACE_PEEKUSER) and ptrace(PTRACE_PEEKDATA)?ptrace(PTRACE_PEEKUSER) 和 ptrace(PTRACE_PEEKDATA) 之间的区别?
【发布时间】:2012-04-05 22:18:59
【问题描述】:

在ptrace 上发布了很多问题后(最近的 5 个问题是我的 :( )我更换时终于得到了想要的输出

reg_val[1] = ptrace(PTRACE_PEEKDATA, child, 4 * EBX, NULL);

与

reg_val[1] = ptrace(PTRACE_PEEKUSER, child, 4 * EBX, NULL);

man page中提到的区别是这样的

  • PTRACE_PEEKTEXT在孩子记忆中的位置addr读取一个单词
  • PTRACE_PEEKUSER 在孩子的 USER 区域的 offset addr 处读取一个单词

我无法单独从手册页中理解这种差异。谁能教我更多这方面的知识??

【问题讨论】:

    标签: c system-calls strace ptrace


    【解决方案1】:

    PTRACE_PEEKDATA 用于读取孩子的数据/代码部分(通常是进程——所谓的跟踪)。如您所知,调试器经常使用ptrace。他们可以使用此调用来检查变量的值。比如在GDB/DBX,如果你说

    print count
    

    调试器将在内部调用 ptrace 和 PTRACE_PEEKDATA 并找到它的值。

    PTRACE_PEEKUSER 用于读取孩子的 USER 区域的内容,该区域包含寄存器内容和其他信息。 sys/user.h 列出了其他信息。

    例如USER区域包含,

    struct user_regs_struct
    {
      long int ebx;
      long int ecx;
      long int edx;
      long int esi;
      long int edi;
      long int ebp;
      long int eax;
      long int xds;
      long int xes;
      long int xfs;
      long int xgs;
      long int orig_eax;
      long int eip;
      long int xcs;
      long int eflags;
      long int esp;
      long int xss;
    };
    

    简而言之:

    • PTRACE_PEEKDATA 用于程序数据(例如变量)和代码;
    • PTRACE_PEEKUSER 用于寄存器值和其他调试信息;

    注意PTRACE_PEEKDATA 和PTRACE_PEEKTEXT 之间的等价性。来自man ptrace:

    Linux 没有单独的文本和数据地址空间,因此这两个请求目前是等价的。

    【讨论】:

    • PTRACE_PEEKDATA is for things like register values and other debug info. 不是ebx,ecx寄存器值吗?? :O 我是这么认为的。你说的寄存器是什么意思? EIP(指令指针)??
    • 抱歉错字。我纠正了它。 PTRACE_PEEKUSER 用于寄存器,而 NOT PTRACE_PEEKDATA
    • 你的最后一句话让我很困惑(是错字吗??)。您说 peekdata 用于程序数据。很好的达。现在你又说 peekdata 是用于寄存器的!你是说 peekuser 吗??
    • 您好;很抱歉复活了一个古老的帖子,但想知道:孩子的USER区域实际上存储在虚拟内存中的哪个位置?我知道这可能是特定于实现的,但是——比如说——在 Ubuntu 64 位上,PTRACE_PEEKUSER 实际在虚拟内存的哪个位置查找?提前非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2013-05-21
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多