面对一些内存占用率无端升高的问题,通过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!
没有评论:
发表评论