2013-02-14 48 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