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

时间:2013-12-13 05:58:32

标签: c solaris dtrace

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

2 个答案:

答案 0 :(得分:4)

有各种工具已经实现了识别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

有关更深入的示例,请查看http://ewaldertl.blogspot.fr/2010/09/debugging-memory-leaks-with-dtrace-and.htmlhttp://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的每个内存操作,然后分析程序读取并处理所有跟踪,并指出可疑的内存泄漏,还使用各种启发式方法指出强烈怀疑的内存泄漏。如果您有兴趣,可以在这里查看:

https://github.com/ppissias/DTLeakAnalyzer