ios DTrace内置变量stackdepth始终返回0

r1wp621o  于 2023-02-20  发布在  iOS
关注(0)|答案(2)|浏览(106)

我最近使用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程序上都试过了。
有人知道发生了什么吗?还有当探测器发射时,如何获得堆栈深度?

z9ju0rcb

z9ju0rcb1#

您需要使用ustackdepth--用户连接域堆栈深度。
变量stackdepth表示内核线程堆栈深度;变量ustackdepth表示用户级线程堆栈深度,当被跟踪程序在用户级执行时,stackdepth将(应该!)始终为0。
X1 M4 N1 X是使用与X1 M5 N1 X相同的逻辑来计算的,所述逻辑用于遍历用户平台堆栈(正如X1 M6 N1 X和X1 M7 N1 X使用类似的逻辑用于内核堆栈)。

km0tfn4u

km0tfn4u2#

在我看来,这似乎是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

相关问题