我最近正在使用DTrace分析我的iOS应用。
除了我尝试使用内置变量stackDepth之外,其他所有操作都很顺利。
我阅读了文档here,其中显示了内置变量stackDepth的引入。
所以我写了一些D代码
order name/food name date totalcost payment
-------------------------------------------------------------
order1--> Amy's 2019-1-15 50 Cash
Apple 2019-1-15 12 Cash
Beef 2019-1-15 15 Cash
Orange 2019-1-15 9 Cash
Apple pie 2019-1-15 14 Cash
order2--> Hotel1's 2019-1-18 7 Visa
Apple 2019-1-18 4 Visa
Orange 2019-1-18 3 Visa
并使用sudo dtrace -s temp.d -c ./simple.out运行它。unstack()函数运行得很好,但是stackDepth总是显示为0。
我在iOS应用程序和简单的C程序上都尝试过。
所以有人知道发生了什么吗? 以及如何在发射探头时获得堆栈深度?
答案 0 :(得分:1)
您要使用ustackdepth
-用户界面堆栈深度。
stackdepth
变量是指内核线程堆栈深度; ustackdepth
变量是指用户界面线程堆栈的深度。当跟踪的程序在用户区域中执行时,stackdepth
将(应该!)始终为0。
ustackdepth
的计算逻辑与ustack()
中使用的遍历用户土地堆栈的逻辑相同(就像stackdepth
和stack()
使用类似的逻辑内核堆栈)。
答案 1 :(得分:-1)
对我来说,这似乎是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