如何使用 Dtrace 在 Solaris 10 上检查 malloc?

Nan*_*iao 0 c solaris dtrace

我遇到了一个关于内存使用的麻烦错误,所以我想在 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 呢?

jll*_*gre 5

有各种工具已经实现了在 Solaris 下识别内存泄漏所需的逻辑,

  • libumem & mdb (UMEM_DEBUG=default UMEM_LOGGING=transaction LD_PRELOAD=libumem.so.1然后mdb's ::findleaks)
  • dbx ( check -leaks)

如果您仍然想走这dtrace条路,您需要使用 pid 提供程序跟踪您怀疑泄漏内存的进程。您搜索了内核探测器dtrace -l并没有找到任何东西,但这是预期的,因为内核没有实现mallocbrk。它们是位于 C 标准库中的用户空间函数。

此脚本将跟踪程序的每个mallocfree调用:

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.htmlhttp://www.joyent.com/blog /bruning-问题-调试