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

标签 c linux memory memory-management memory-leaks

链接到多个库的进程导致内存泄漏。内存泄漏来自其中一个库。我想看看是否有一种方法可以识别从这些库中的函数分配的内存。每个库使用的大小是多少?

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

基本上,我想看看是否有一种方法可以识别泄漏的库和泄漏的内存并将其转储。

最佳答案

如果没有外部工具的帮助,这会有点困难。您必须意识到,没有什么比“仪表”更能告诉您的进程实际使用了多少内存,以及哪个库函数分配了该内存。这基本上与两件事有关:

  1. 将内存交给进程的操作系统并不关心或知道哪个库请求内存 - 将新页面映射到进程内存只是像其他任何系统调用一样的系统调用。
  2. 通常,libc 向程序/库/程序员提供诸如 malloc()free() 之类的功能。这些函数包装了操作系统的内存分配/取消分配(实际上是映射和取消映射)功能;这允许您以不是页面大小(通常为 4kB)倍数的单位分配和释放内存。但是,这也意味着您不能真正依赖操作系统来告诉您进程实际使用了多少内存、已正确清理了多少内存以及泄漏了多少内存。

因此,您需要某种机制来处理 libc 和您的操作系统,以便您检查进程在内部执行的操作。典型的工具是 Valgrind。它并不太复杂,所以我鼓励您尝试一下。

关于c - 有没有办法识别库中内存分配的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28196760/

相关文章:

java - Android:将 ArrayList 转换为 GSON 内存不足

c - 只读存储器是如何在 C 中实现的?

c - 替代 dir 命令来查询 C 中的目录

android - Linux内核安卓

javascript - 将 JavaScript 对象添加到多个数组

Java Home 未定义(wso2ei-6.4.0 安装)

linux - 作为 bash 脚本调用时如何替换命令名称?

c - 为什么 free(pointer) 会出现运行时错误?

c - Linux 内核 0.11 中的进程 0 堆栈

C 局部变量与函数同名 - 它是如何工作的?