【问题标题】:Linux ptrace() read whole memory pageLinux ptrace() 读取整个内存页
【发布时间】:2015-12-23 10:21:46
【问题描述】:

您好,我尝试在 Android/Linux 中转储进程的内存。现在我读取内存映射以获取内存区域的地址空间,然后像这样读取每个单词:

ptrace(PTRACE_ATTACH, pid, NULL, NULL);
wait(NULL);

read each word in this memory region:
word = ptrace(PTRACE_PEEKDATA, pid, (void *)address, NULL);

ptrace(PTRACE_CONT, pid, NULL, NULL);
ptrace(PTRACE_DETACH, pid, NULL, NULL);

难道没有更高效的解决方案,通过指定要读取的内存地址空间的开始/结束来直接读取整个内存页面?

【问题讨论】:

  • 您到底想达到什么目的?通过读取“文件”/proc/pid/mem 可以完成进程的完整转储
  • 我想要所有可写内存页的转储。我现在使用 openlseekread 实现了堆转储。但是当我尝试访问堆栈等其他内存区域时,仍然会出现 I/O 错误。

标签: android c++ c linux ptrace


【解决方案1】:

有两种可能的方法可以更有效地从另一个进程读取内存。

如果你的内核支持它(我不知道 Android 内核)你可以使用process_vm_readv

另一种方法是打开目标进程的/proc/.../mem文件并从中读取。 gdb 使用这种方法,但我认为这只是因为process_vm_readv 是“新的”(在 gdb 的术语中)。

【讨论】:

  • process_vm_readv 在 Android 中不可用 -> 导致 error: undefined reference to 'process_vm_readv' 但感谢您的建议,我现在设法做到了使用 open、lseek 和 read 从 /proc/pid/mem 读取堆。
猜你喜欢
  • 1970-01-01
  • 2016-03-26
  • 2020-12-19
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多