我研究了一个使用GLIBC 2.25的嵌入式设备。
当我查看/proc/PID/maps
时,我看到堆部分下有一些匿名部分,我理解当进程使用new
时创建的部分
我用dd
转储这些部分,这里有一个有趣的值,我想了解的是缓冲区分配或空闲,以及这个缓冲区的大小。
我该怎么做呢?
您可以使用gdb (GNU调试器)工具检查正在运行的进程的内存。您可以使用进程的PID连接到该进程,并使用x命令检查特定地址的内存。还可以使用info proc mapping命令查看进程的内存映射,包括堆大小。此外,您可以使用heap命令列出堆块,并使用malloc_info命令显示堆块的详细信息。
您还可以使用malloc_stats函数来显示有关堆使用情况的信息,例如已分配的字节数、空闲的字节数和正在使用的字节数。
还可以使用pmap命令显示进程的内存映射,包括堆大小。此命令在某些系统上可用,而在其他系统上可能不存在。
同样值得注意的是,/proc/pid/maps文件还可以让您了解进程的堆部分。
请记住,您需要获得访问您想要检查的进程的权限。
不要从进程中分析内存,您可以尝试以下选项,但仅限于您的环境。
- 如果您怀疑任何类型的泄漏或无效的读写,请使用像valgrind这样的工具。
- 而不是查看dd的输出,附加到正在运行的进程并检查进程内的内存,为您提供上下文来理解内存使用情况。
- 使用日志记录转储分配/自由/读/写地址。这可以让你更好地理解内存的使用情况。
根据任务的复杂程度,您可能需要使用上述所有选项。