分析Objective C中的代码路径是否为TraceGL?

Dan*_*maa 5 xcode cocoa objective-c ios

TraceGL是一个非常简洁的项目,允许JS程序员在Javascript中跟踪代码路径.它看起来像这样:

在此输入图像描述

我想为Objective C构建类似的东西.我知道运行时使跟踪方法调用变得相当容易,但我如何跟踪控制流?例如,在上面的屏幕截图中,未执行的代码路径显而易见,带有红色突出显示.在Objective C/Xcode工作流程中实现类似功能的最佳方法是什么?

到目前为止,我提出的最好的方法是编写一个预处理器,在将代码发送到编译器之前将代码注入临时源文件.谁有更好的主意?

Jay*_*Jay 6

我想Xcode静态分析器发现问题的可视化器非常接近这一点 - 虽然这只会给你一个特定问题的调用路径,如内存泄漏.

在Xcode中尝试"产品>分析",选择在任何给定项目中找到的任何问题,然后单击代码编辑器中的蓝色箭头以查看您自己.

在此输入图像描述


xmo*_*jmr 2

不完全是 Objective C 和 XCode 的答案。

对于 C++ 代码,有一个工业质量代码覆盖率工具BullseyeCoverage

  • 功能覆盖范围为您提​​供快速概览,条件/决策覆盖范围为您提​​供高精度
  • 适用于您可以用 C++ 和 C 编写的所有内容,包括系统级和内核模式

如果您想自己发明/编写这种工具,我建议您查看(评估)一些解决相同任务的现有工具,这样您就不会错过关键功能

此类工具基本上有两类

  • 在二进制级别、仪器字节代码、库入口点等上工作。
  • 在源代码级别工作,在进入编译器之前检测源代码

检测的目的是在代码中插入对分析运行时的调用,该分析运行时收集运行时统计信息以进行进一步处理。

基本通话

  • 时间戳、线程id、源代码地址、进入
  • 时间戳、线程id、源代码地址、离开

源代码地址取决于您感兴趣的粒度。它可以是函数名称,也可以是源文件和行号。

收集的性能数据可能非常庞大,因此通常会对它们进行汇总,并且不会捕获整个调用堆栈。它通常具有足够的详细程度来检测性能瓶颈。

另一个缺点是,捕获详细的性能数据(尤其是在多次命中的代码点中)会显着降低应用程序的速度。

如果您想要完整的历史记录,请捕获包括时间戳和线程 ID 在内的完整跟踪,并且稍后您将能够重新创建调用堆栈,因为知道每个调用堆栈enter都有相应的leave.

为了保证这种配对,代码检测必须插入异常处理调用,以确保即使函数抛出异常,也会记录退出点(什么是“异常”以及如何最终尝试,这取决于语言和操作系统平台) )。

要获得所有必要的技巧和技巧,请评估一些工具并查看它们的仪器风格

顺便说一句:总的来说,需要做很多工作,并且要做好,我个人曾两次或多次思考过结果和成本。

作为一个想玩的主题,我完全推荐它。我创建了这样一个工具,用于对在 C++ 源代码级别和 Java 二进制级别工作的 Java MIDP 应用程序进行故障排除,并且在我们需要它时它很有帮助。