我遇到了一个关于内存使用的麻烦错误,所以我想在Solaris 10上使用Dtrace来检查malloc和free。
我使用以下命令
dtrace -l | grep malloc
输出结果为:
7000 fbt unix prom_malloc entry
7001 fbt unix prom_malloc return
7141 fbt genunix cacl_malloc entry
7142 fbt genunix cacl_malloc return
12319 fbt genunix rmallocmap_wait entry
12320 fbt genunix rmallocmap_wait return
13078 fbt genunix rmalloc_wait entry
13079 fbt genunix rmalloc_wait return
13526 fbt genunix rmallocmap entry
13527 fbt genunix rmallocmap return
16846 fbt genunix rmalloc entry
16847 fbt genunix rmalloc return
25931 fbt tmpfs tmp_memalloc entry
25932 fbt tmpfs tmp_memalloc return
似乎没有malloc。
我检查了Solaris Internal,发现malloc调用了sbrk。所以我使用以下命令:
dtrace -l | grep sbrk
但是没有找到任何东西。
那么如何在Solaris 10上使用Dtrace检查malloc?
答案 0 :(得分:4)
有各种工具已经实现了识别Solaris下的内存泄漏所需的逻辑,
UMEM_DEBUG=default UMEM_LOGGING=transaction LD_PRELOAD=libumem.so.1
然后mdb's ::findleaks
)check -leaks
)如果您仍希望采用dtrace
方式,则需要使用pid提供程序跟踪您怀疑泄漏内存的进程。您使用dtrace -l
搜索了内核探测器,但没有发现任何内容,但由于内核未实现malloc
或brk
,因此这是预期的。它们是位于C标准库中的用户区函数。
此脚本将跟踪程序的每个malloc
和free
来电:
dtrace -qn '
pid$target:libc:malloc:entry {
self->size=arg0;
}
pid$target:libc:malloc:return /self->size/ {
printf("malloc(%d)=%p\n",self->size,arg1);
self->size=0;
}
pid$target:libc:free:entry {
printf("free(%p)\n",arg0);
}
' -c program_to_trace
有关更深入的示例,请查看http://ewaldertl.blogspot.fr/2010/09/debugging-memory-leaks-with-dtrace-and.html和http://www.joyent.com/blog/bruning-questions-debugging
答案 1 :(得分:-1)
例如,为了使用dtrace跟踪所有malloc调用,通过打印每个分配,您将编写如下脚本(在此示例中,该文件名为trace-malloc.d):
#!/usr/sbin/dtrace -s
pid$1::malloc:entry
{
self->trace = 1;
self->size = arg0;
}
pid$1::malloc:return
/self->trace == 1/
{
/* log the memory allocation */
printf("<__%i;%Y;%d;malloc;0x%x;%d;\n", i++, walltimestamp, tid, arg1, self->size);
ustack(50);
printf("__>\n\n");
self->trace = 0;
self->size = 0;
}
,然后通过传递要跟踪的进程的进程ID进行调用, 例如:
./trace-malloc.d 12345
在复杂的程序中,内存分配和取消分配非常频繁,因此我编写了一个小程序来帮助我使用dtrace识别内存泄漏。跟踪具有malloc / calloc / realloc和free的每个内存操作,然后分析程序读取并处理所有跟踪,并指出可疑的内存泄漏,还使用各种启发式方法指出强烈怀疑的内存泄漏。如果您有兴趣,可以在这里查看: