我最近使用DTrace分析我的iOS应用程序。
除了尝试使用内置变量stackDepth之外,一切都很顺利。
我读了这里的文档,其中显示了内置变量stackDepth的介绍。
我写了一些D代码
pid$target:::entry
{
self->entry_times[probefunc] = timestamp;
}
pid$target:::return
{
printf ("-----------------------------------\n");
this->delta_time = timestamp - self->entry_times[probefunc];
printf ("%s\n", probefunc);
printf ("stackDepth %d\n", stackdepth);
printf ("%d---%d\n", this->delta_time, epid);
ustack();
printf ("-----------------------------------\n");
}
然后用sudo dtrace -s temp.d -c ./simple.out. unstack()函数运行它,运行效果非常好,但是stackDepth总是显示为0。
我在我的iOS应用程序和一个简单的C程序上都试过了。
有人知道发生了什么吗?还有当探测器发射时,如何获得堆栈深度?
2条答案
按热度按时间z9ju0rcb1#
您需要使用
ustackdepth
--用户连接域堆栈深度。变量
stackdepth
表示内核线程堆栈深度;变量ustackdepth
表示用户级线程堆栈深度,当被跟踪程序在用户级执行时,stackdepth
将(应该!)始终为0。X1 M4 N1 X是使用与X1 M5 N1 X相同的逻辑来计算的,所述逻辑用于遍历用户平台堆栈(正如X1 M6 N1 X和X1 M7 N1 X使用类似的逻辑用于内核堆栈)。
km0tfn4u2#
在我看来,这似乎是DTrace的Mac / iOS实现中的一个错误。
然而,既然你已经探测了每个函数的入口和返回,你可以只保留一个新变量
self->depth
,在:::entry
探测器中执行++
,在:::return
探测器中执行--
。如果你对优化代码运行它,这就不能工作得很好,因为任何尾部调用优化的函数可能看起来像它们进入了,但从来没有返回。为了解决这个问题,您可以关闭优化。另外,由于您所做的操作看起来很像这样,我想您可能会对
-F
选项感兴趣:通过标识函数入口和返回来合并跟踪输出。函数入口探测报告缩进,其输出以
->
为前缀。函数返回探测报告不缩进,其输出以<-
为前缀。用于
-F
的正常脚本如下所示:其中
some_function
是要打印其执行情况的函数。输出显示该执行的文本调用图: