内置可变堆栈深度中的 DTrace 生成始终返回 0



我最近正在使用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 ("%sn", probefunc);
printf ("stackDepth %dn", stackdepth);
printf ("%d---%dn", this->delta_time, epid);
ustack();
printf ("-----------------------------------n");
}

并使用 sudo dtrace -s temp.d -c ./simple.out 运行它。unstack() 函数运行得很好,但 stackDepth 总是显示为 0。

我在我的iOS应用程序和一个简单的C程序上都尝试了。

所以有人知道发生了什么吗? 以及如何在探头发射时获得堆栈深度?

您希望使用ustackdepth-- 用户空间堆栈深度。

stackdepth变量是指内核线程堆栈深度;ustackdepth变量是指用户-land线程堆栈深度。当跟踪的程序在用户空间中执行时,stackdepth将(应该!)始终为 0。

ustackdepth的计算逻辑与用于遍历用户土地堆栈的逻辑相同,就像ustack()一样(就像stackdepthstack()对内核堆栈使用类似的逻辑一样)。

对我来说,这似乎是 DTrace 的 Mac/iOS 实现中的一个错误。

但是,由于您已经在探测每个函数条目和返回,因此您可以保留一个新的变量self->depth并在:::entry探测器中执行++,并在:::return探测器中--。如果您针对优化的代码运行它,这不太正确,因为任何尾部调用优化的函数可能看起来像是进入但永远不会返回。要解决此问题,您可以关闭优化。

另外,因为你正在做的事情看起来很像这样,我想也许你会对-F选项感兴趣:

通过识别函数输入和返回来合并跟踪输出。 函数条目探测报告缩进,其输出带有前缀 与->.函数返回探测报告未缩进,其输出 以<-为前缀。

用于-F的常规脚本如下所示:

pid$target::some_function:entry { self->trace = 1 }
pid$target:::entry /self->trace/ {}
pid$target:::return /self->trace/ {}
pid$target::some_function:return { self->trace = 0 }

其中some_function是要打印其执行的函数。输出显示了该执行的文本调用图:

-> some_function
-> another_function
-> malloc
<- malloc
<- another_function
-> yet_another_function
-> strcmp
<- strcmp
-> malloc
<- malloc
<- yet_another_function
<- some_function

最新更新