我正在尝试调试内存泄漏问题.我正在使用mtrace()来获取malloc/free/realloc跟踪.我已经运行了我的编程,现在有一个巨大的日志文件.到现在为止还挺好.但是我在解释文件时遇到了问题.看看这些线:
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x1502570 0x68
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x1502620 0x30
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x2aaab43a1700 0xa80
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x1501460 0xa64
Run Code Online (Sandbox Code Playgroud)
奇怪的是,一个调用(相同的返回地址)负责4个分配.
更奇怪的是:
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x2aaab43a1700 0xa2c
…
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x2aaab43a1700 0xa80
Run Code Online (Sandbox Code Playgroud)
在这两行之间,块0x2aaab43a1700永远不会被释放.
有谁知道如何解释这个?一次调用如何导致4次分配?而malloc如何返回之前已分配的地址?
编辑2008/09/30:分析GLIBC(mtrace.pl)提供的mtrace()输出的脚本在这里没有任何帮助.它只会说:Alloc 0x2aaab43a1700重复.但这怎么可能发生呢?
我正试图用来mtrace
检测fortran程序中的内存泄漏.我正在使用gfortran编译器.有关mtrace的(工作)C示例,请参阅维基百科条目:http://en.wikipedia.org/wiki/Mtrace
我尝试了两种方法,即包装mtrace()和muntrace()并从fortran程序调用它们,以及创建一个直接调用mtrace()和muntrace()的C程序,除了它们之间泄漏的fortran代码.两种方法都无法检测到内存泄漏,但在这里我只介绍后者.
example.c
#include <stdlib.h>
#include <mcheck.h>
extern void leaky_(); // this might be different on your system
// if it doesn't work, try to run:
// 1) gfortran leaky.f90 -c
// 2) nm leaky.o
// and then change this declaration and its use below
void main() {
mtrace();
leaky_();
muntrace();
}
Run Code Online (Sandbox Code Playgroud)
leaky.f90
subroutine leaky()
real, allocatable, dimension(:) :: tmp
integer :: error
allocate (tmp(10), stat=error)
if (error /= 0) then
print*, "subroutine leaky could …
Run Code Online (Sandbox Code Playgroud) 在分析大型应用程序的内存消耗期间,我使用 glibc 中的 mtrace。但问题是它只提供了 malloc 调用的来源,但没有提供完整的堆栈跟踪。因此,如果我在许多地方使用的方法中使用 malloc,我只会报告一个无法区分的 malloc 来源。另一个问题是标准 C 库和通用对象(如 CSimpleArray)。我只知道有人使用了巨大的数组,但不知道到底是谁。
所以我想我需要完整的堆栈跟踪才能知道到底是谁使用了 malloc。你知道 mtrace 是否存在这样的变体吗?或者可以简单地修改它来做到这一点吗?
只是备注一下:我的 mtrace.out 日志包含 300k 行,使用 mtrace 脚本处理后,它有 10k 条目。如果我只定位 10% 最大的块,对我来说就足够了。
如何在没有源的情况下启用mtrace()
(和MALLOC_TRACE
env)二进制程序?
mtrace是glibc的特色:http://www.gnu.org/s/hello/manual/libc/Allocation-Debugging.html
谢谢