我遇到了一个关于内存使用的麻烦错误,所以我想在 Solaris 10 上使用 Dtrace 来检查 malloc 和 free。
我使用以下命令
dtrace -l | grep malloc
Run Code Online (Sandbox Code Playgroud)
输出是:
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
Run Code Online (Sandbox Code Playgroud)
好像没有malloc。
我检查了 Solaris Internal,发现 malloc 调用了 sbrk。所以我使用以下命令:
dtrace -l | grep sbrk
Run Code Online (Sandbox Code Playgroud)
但是什么也没找到。
那么如何使用 Dtrace 在 Solaris 10 上检查 malloc 呢?
有各种工具已经实现了在 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
Run Code Online (Sandbox Code Playgroud)
有关更深入的示例,请查看http://ewaldertl.blogspot.fr/2010/09/debugging-memory-leaks-with-dtrace-and.html和http://www.joyent.com/blog /bruning-问题-调试