如何将运行C ++进程的堆转储到Linux下的文件中?

时间:2014-07-18 23:11:55

标签: linux debugging heap

我有一个在无头/嵌入式Linux机器上运行的程序,并且在某些情况下该程序似乎占用了相当多的内存(如top等所报告的),而不是我预期的它可以使用。

由于故障情况难以在实际工作环境之外重现,并且由于嵌入式盒子没有安装valgrind或gdb等细节,我想做的只是写出来将进程的堆内存写入文件,然后我可以将其传输到我的开发机器并查看我的闲暇时间,看看我是否可以从文件的内容中分辨出它正在占用哪种数据堆的大部分。如果我很幸运,可能会出现像重复字符串或魔法数字这样的吸烟枪,这会让我发现我的代码中的地方要么泄漏,要么只是在不受限制地增长数据结构。

这样做有好办法吗?我能想到的唯一方法是强制进程崩溃然后收集核心转储,但由于故障情况很少,因此我最好能收集信息而不会将进程作为副作用而崩溃。

1 个答案:

答案 0 :(得分:3)

您可以通过/ proc / pid / mem读取进程的整个内存空间;你可以阅读/ proc / pid / maps来查看内存空间中的位置(这样你就可以找到堆的边界并读取它)。您可以尝试在进程运行时读取数据(在这种情况下,它在读取时可能会发生变化),或者您可以使用SIGSTOP信号停止该进程,然后使用SIGCONT恢复该进程。