2013-02-14 58 views
4

我遇到這個簡單的DTrace腳本用於跟蹤用戶堆棧大小,但它並沒有在OS X山獅的工作:DTrace:跟蹤OS X上的用戶堆棧大小? (curthread-> t_procp-> p_stksize?)

dtrace -n 'sched:::on-cpu { @[execname] = max(curthread->t_procp->p_stksize);}' 

(來源:http://www.solarisinternals.com/wiki/index.php/DTrace_Topics_One_Liners

在OS X上返回的錯誤是:

dtrace: invalid probe specifier sched:::on-cpu { @[execname] = 
    max(curthread->t_procp->p_stksize);}: in action list: 
    t_procp is not a member of struct thread 

事實上,我有一個困難時期試圖找出什麼「curthread相關」的有效成員是在OS X上是否有一個相當於深入到當前用戶堆棧大小的方式爲線程?或者「curthread」只是OS X上的一個不透明的指針,只能用於線程標識?請注意,如果這有助於任何操作,我會很樂意通過「pid」提供程序執行此跟蹤。

謝謝!

+2

的OSX的'結構thread'可以在這裏找到:HTTP:// WWW .opensource.apple.com/source/xnu/xnu-2050.9.2/osfmk/kern/thread.h – trojanfoe 2013-02-14 16:36:09

+0

謝謝,這當然很有趣,但我仍然不知道如何從那裏獲得用戶堆棧大小,因爲OS X結構與特性t_procp-> p_stksize之上的(推測的)Solaris結構不同。 – 2013-02-14 23:05:37

+1

從搜索各種來源看來,似乎沒有OSX等價物。從命令行嘗試'apropos dtrace'查看隨Mac提供的腳本;他們都沒有提供你正在尋找的東西,所以你可能必須自己寫這個。 – trojanfoe 2013-02-15 07:28:48

回答

0

我沒有找到它的記錄,但注意到Instruments支持記錄用戶堆棧大小。使用dtrace導出我確定它是通過內建變量ustackdepth

例如,該腳本將啓動記錄所有方法調用,一旦-abortEditing方法被調用,最多2個呼叫深:

#!/usr/sbin/dtrace -s 
#pragma D option quiet 

objc$target::*abortEditing*:entry 
/thread == 0/ 
{ 
start = ustackdepth; 
thread = tid; 
} 

objc$target:::entry 
/thread == tid && ustackdepth - start < 2/ 
{ 
printf("%*s %s %s\n", ustackdepth - start + 3, "->", probemod, probefunc); 
} 

objc$target:::return 
/thread == tid && start == ustackdepth/ 
{ 
thread = 0; 
} 
+0

雖然我認爲ustackdepth是堆棧幀的數量。我想知道實際的堆棧大小,以字節爲單位。這似乎並不容易在Mac上完成。 – 2015-08-19 17:35:39

+0

啊,對 - 這是對另一個問題的回答 – akvadrako 2015-08-19 18:03:29