2013-12-13 31 views
0

我遇到內存使用麻煩的錯誤,所以我想使用DTrace檢查malloc和free在Solaris 10上如何使用Dtrace檢查Solaris 10上的malloc?

我用下面的命令

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 

但沒有發現。

那麼,如何使用Dtrace檢查Solaris 10上的malloc?

+1

我想這個工具將是對您有用:http://theunixshell.blogspot.com/2013/11/finding-memory-leaks-on-solaris-is-no.html – Vijay

+0

@Vijay:非常感謝您的意見,這是一個非常酷的工具! –

+0

@Vijay:你願意打開你的工具的源代碼嗎? –

回答

3

有跡象表明,已經實現了,以確定在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