有没有办法从库中识别有关内存分配的详细信息

时间:2015-01-28 15:58:57

标签: c linux memory memory-management memory-leaks

我链接到多个库的进程导致内存泄漏。内存泄漏来自其中一个库。我试图看看是否有办法识别从驻留在这些库中的函数分配的内存。每个图书馆使用的大小是多少?

在根据调用malloc的位置进行分配时,内存分配器是否会遵循任何特定方式。就像,如果从Lib A调用它,分配将从地址从0xA开始,对于lib B,0xB等进行。

基本上,我正在尝试查看是否有办法识别泄漏的库并泄漏内存并将其转储。

1 个答案:

答案 0 :(得分:0)

如果你在没有外部工具帮助的情况下这样做会有点困难。你必须意识到,没有什么比一个"衡量"告诉你的进程它实际使用了多少内存,以及哪个库函数分配了那个内存。这基本上与两件事有关:

  1. 您的操作系统正在处理您的进程内存,并不关心或知道哪个库要求内存 - 将新页面映射到您的进程中'内存只是一个与其他系统一样的系统调用。
  2. 通常,libc是向程序/库/程序员提供malloc()free()等功能的人。这些函数包含您的操作系统内存分配/取消分配(实际上是映射和取消映射)功能;这允许您以不是页面大小的倍数(通常为4kB)的单位分配和释放内存。但是,这也意味着您无法真正依赖您的操作系统来告诉您您的流程实际使用了多少内存,已正确清理了多少以及泄漏了多少。
  3. 因此,您需要一些机制来处理libc和您的操作系统,它允许您检查您的流程在内部执行的操作。一个典型的工具是Valgrind。它不是太复杂,所以我鼓励你尝试一下。