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

C 有没有办法识别库中内存分配的详细信息,c,linux,memory,memory-management,memory-leaks,C,Linux,Memory,Memory Management,Memory Leaks,我的进程链接到多个库,导致内存泄漏。内存泄漏来自其中一个库。我试图看看是否有一种方法可以识别从驻留在这些库中的函数分配的内存。每个库使用的大小是多少 内存分配器在根据调用malloc的位置进行分配时是否会遵循任何特定的方式。类似地,若从库A调用,分配将从从0xA开始的地址开始,对于库B、0xB等 基本上,我想看看是否有办法识别泄漏的库和泄漏的内存并将其转储 如果没有外部工具的帮助,这将有点困难。您必须知道,没有什么比“仪表”更能告诉您的进程它实际使用了多少内存,以及哪个库函数分配了这些内存。这基

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

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


基本上,我想看看是否有办法识别泄漏的库和泄漏的内存并将其转储

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

  • 将内存交给进程的操作系统不关心或不知道哪个库需要内存——将新页映射到进程内存就像其他任何库一样,只是一个系统调用
  • 通常,libc是为程序/库/程序员提供诸如
    malloc()
    free()
    等功能的libc。这些函数包装了操作系统的内存分配/取消分配(实际上是映射和取消映射)功能;这允许您以页面大小的倍数(通常为4kB)为单位分配和释放内存。然而,这也意味着你不能真正依靠你的操作系统来告诉你进程中有多少内存正在使用,有多少已经被正确清理,还有多少正在泄漏

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

    您是如何检测泄漏的,您使用了吗?如果你没有这么做。@iharob谢谢你的评论。但是,在这种情况下,我不能使用valgrind。这个特殊的进程已经耗尽了所有可用的系统内存,并导致内核崩溃。我们还有另一台机器处于同样的情况,但还没有崩溃。我正试图在实时进程死亡和内核可用之前最大限度地利用它。乔,这样的程序不应该存在。耗尽内存会导致程序因内存不足错误而终止。在这之前很久,使用valgrind应该仍然是可能的。如果不可能像Marcus Müller那样使用
    valgrind
    ,你可以阅读。但是,如果库中有一些自定义分配器,它将无法工作。@MarcusMüller,正如我所说的,二进制文件中不可能进行插装。你是说那个杀人凶手吗?这一过程在那之前就已经开始了。它导致了一个malloc失败,名为abort(),感谢您查看一下@Marcus Müller,但问题是——我在这里说的是发布代码中的一个问题。不可能使用仪器。正如我在前面的评论中提到的,我所拥有的只是一个二进制文件和一个由类似二进制文件生成的核心文件。我知道Vallgrind,我也用过。但是这里没有帮助。如果所有的东西都被编译了,并且里面没有调试符号,那么谁会知道内存分配发生在哪里呢?然而,只要程序不是静态编译的,libc调用就应该可以被valgrind截获。我在这里有点困惑。我正在处理一个问题,这个问题只能在客户端重现,而这个问题的核心来自于发布代码中的核心。所以我的手脚都绑在这里了。我的问题更多的是从核心角度进行法医学分析。但是,请接受您的答案,因为您提到的调试方法是正确的。