gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:22:28 25 4
gpt4 key购买 nike

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

最佳答案

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

  • libumem 和 mdb(UMEM_DEBUG=default UMEM_LOGGING=transaction LD_PRELOAD=libumem.so.1 然后是 mdb 的::findleaks)
  • dbx(检查泄漏)

如果您仍想采用 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

关于c - 如何使用 Dtrace 检查 Solaris 10 上的 malloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20560033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com