标签: mtrace

GLIBC:调试内存泄漏:如何解释mtrace()的输出

我正在尝试调试内存泄漏问题.我正在使用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重复.但这怎么可能发生呢?

c memory-leaks glibc mtrace

5
推荐指数
2
解决办法
6180
查看次数

mtrace for fortran program

我正试图用来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)

c gcc fortran memory-leaks mtrace

5
推荐指数
1
解决办法
1892
查看次数

是否有具有完整堆栈跟踪的 mtrace?或者可以简单地修改它以具有此功能吗?

在分析大型应用程序的内存消耗期间,我使用 glibc 中的 mtrace。但问题是它只提供了 malloc 调用的来源,但没有提供完整的堆栈跟踪。因此,如果我在许多地方使用的方法中使用 malloc,我只会报告一个无法区分的 malloc 来源。另一个问题是标准 C 库和通用对象(如 CSimpleArray)。我只知道有人使用了巨大的数组,但不知道到底是谁。

所以我想我需要完整的堆栈跟踪才能知道到底是谁使用了 malloc。你知道 mtrace 是否存在这样的变体吗?或者可以简单地修改它来做到这一点吗?

只是备注一下:我的 mtrace.out 日志包含 300k 行,使用 mtrace 脚本处理后,它有 10k 条目。如果我只定位 10% 最大的块,对我来说就足够了。

c++ profiling memory-management mtrace

5
推荐指数
0
解决办法
503
查看次数

为二进制程序启用mtrace(MALLOC_TRACE)

如何在没有源的情况下启用mtrace() (和MALLOC_TRACEenv)二进制程序?

mtrace是glibc的特色:http://www.gnu.org/s/hello/manual/libc/Allocation-Debugging.html

谢谢

malloc glibc mtrace

4
推荐指数
1
解决办法
3672
查看次数

标签 统计

mtrace ×4

c ×2

glibc ×2

memory-leaks ×2

c++ ×1

fortran ×1

gcc ×1

malloc ×1

memory-management ×1

profiling ×1