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

Is there a way to identify details about memory allocations from a library

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

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

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

如果不借助外部工具,这会有点困难。您必须知道,没有什么比 "gauge" 更能告诉您的进程它实际使用了多少内存,以及哪个库函数分配了该内存。这基本上与两件事有关:

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

因此,您将需要一些机制来处理 libc 和您的 OS,它允许您检查您的进程在内部做什么。一个典型的工具是 Valgrind。它并不过分复杂,所以我鼓励您尝试一下。