在Objective C a Trace Trace中分析代码path?
TraceGL是一个非常整洁的项目,它允许JS程序员在Javascript中跟踪代码path。 它看起来像这样:
我想为Objective C构build类似的东西。我知道运行时已经使追踪方法调用变得相当容易,但是如何追踪控制stream呢? 例如,在上面的屏幕截图中,未执行的代码path显示为红色突出显示。 Objective C / Xcode工作stream程中实现类似的最好方法是什么?
到目前为止,最好的方法是编写一个预处理程序,在将代码发送到编译器之前将代码注入临时源文件。 任何人有更好的主意?
不完全是Objective C和XCode的答案。
对于C ++代码,有一个工业质量代码覆盖工具BullseyeCoverage
- function覆盖给你一个快速的概述和条件/决策覆盖给你高精度
- 使用C ++和C编写的所有东西,包括系统级和内核模式
如果你想自己发明/写这种工具,我build议看一下(评估)一些现有的工具,解决相同的任务,以便你不会错过一个关键的function
基本上有两类这样的工具
- 工作在二进制级别, 仪器字节码 ,库入口点等
- 在源代码级工作, 仪器源代码在去编译器之前
该工具的目的是插入到调用运行时的代码调用中,该调用运行时收集运行时统计信息以供进一步处理。
基本通话
- 时间戳,线程ID,源代码地址, 进入
- 时间戳,线程ID,源代码地址, 离开
源代码地址取决于您所在的粒度。它可以是函数名称,也可以是源文件和行号。
收集的性能数据可能相当庞大,因此通常会将其总结起来,并且不会捕获整个调用堆栈。 检测性能瓶颈通常是足够详细的。
另一个缺点是捕获详细的性能数据,尤其是在具有多次命中的代码点中会显着减慢应用程序的速度。
如果你想完整的历史logging,然后捕捉包括时间戳和线程标识符的完整跟踪,你将能够在知道每个enter
都有相应的leave
后重新创build调用栈。
为了保证这种配对,代码工具必须插入exception处理调用,以确保即使该函数抛出exception(什么是“exception”以及如何尝试 – 最终依赖于语言和操作系统平台)。
获取所有必要的技巧和技巧, 评估一些工具,并看看他们的仪器风格 。
顺便说一句,总的来说,要做的工作还有很多,为了获得正确的结果,我个人想了两次以上,结果是什么,成本是多less。
作为一个想玩的话题,我强烈build议。 我创build了这样一个工具,用于对在C ++源代码级别和Java二进制级别上运行的Java MIDP应用程序进行故障诊断,这在我们需要的时候非常有用。
我想Xcode的静态分析器发现的问题的可视化器非常接近这个 – 尽pipe这只会给你一个像内存泄漏这样的特定问题的调用path。
在Xcode中尝试“产品>分析” ,select任何给定项目上的任何问题,然后单击代码编辑器中的蓝色箭头查看。