2013年1月25日星期五

使用dumpmem显示进程内存空间中的内容

面对一些内存占用率无端升高的问题,通过top等系统命令我们可以看到哪个进程消耗了内存。进一步地,我们想了解这些进程到底将什么内容载入内存,这时我们可以用到dumpmem这个工具。

dumpmem使用c编写,底层使用ptrace实现,可以在某进程运行的情况下,在线地dump出该进程内存空间中的内容。

每个进程的虚拟内存空间在内核中用mm_struct管理,其中每一个地址段用vm_area_struct管理,/proc/$/maps即显示进程的所有地址段:









dumpmem即先通过/proc/$/maps文件,读取指定进程的所有虚拟内存地址段,记录于以下结构:








最后通过传递PTRACE_PEEKDATA选项给 ptrace 调用,将内存地址中的内容dump到文件中:












除PTRACE_PEEKDATA选项用于dump出进程内存内容外,PTRACE_ATTACH、PTRACE_TRACEME等选项可用于进程跟踪,在dump在线进程内存内容时用到。

ptrace “跟踪” 指定进程的执行,在被跟踪进程执行系统调用或机器指令时,父进程可捕捉到相关信息,给查看被跟踪进程内存、寄存器信息,甚至修改相关内容、更改代码执行路径提供了条件。

Have fun!

没有评论:

发表评论