0

我正在寻找一个框架,我不想详细说明。

假设我的 iPhone 应用程序中有 100 多个类和 1000 多个方法。在这种情况下,我想在每个类的每个方法(开始或结束或两者)中添加 NSLog。

手动添加 NSLog 是可能的,但有没有更好的解决方案?就像以这样的方式构建应用程序,我可以添加此日志而无需我进行手动工作。

谢谢并恭祝安康,


丹尼斯,

您的回答在许多论坛中都是最有用的。非常感谢。

我正在寻找这样的东西的原因是,我们有很多客户项目,而且很多时候我们在 QA 和 UAT 时遇到了一些崩溃或其他问题。其中约 80% 不可重现或需要某些特定场景。我们使用 .crash 和 dsym 来跟踪此类问题。但在这种情况下它不是很有用。

我正在寻找的是提供添加临时构建,它将记录用户遵循的步骤,以便轻松重现此类问题。

目前我正在使用预编译的标头和您提到的第一种方法(搜索第一个左大括号,然后用宏替换它)。

正如您提到的,我将研究 DTrace 和 objc_msgSend。如果您有任何喜欢的教程,我会同时搜索这些内容,这将是很棒的。

谢谢和问候, :D

4

1 回答 1

1

所以你想在你的代码中添加一个跟踪工具?

苹果不提供这样的东西。您必须自己添加跟踪工具。如果您的源代码风格是一致的,这可能相对容易自动完成,例如在以减号(或加号)开头的行之后搜索第一个左大括号......

NSLog或者,您可能希望使用公共的 Objective-C 运行时函数来枚举所有类及其所有方法,然后在跳转到原始方法之前将它们中的每一个与另一个方法混合。

或者,您可以采用开源实现并在开头objc_msgSend插入调用。NSLog请注意,obj_msgSendtail 调用了该方法,因此这将阻止您在返回时添加调用。当然要准备好巨大的输出。您可能希望将您对 NSLog 的调用设置为选择器参数的值objc_msgSend(例如公共前缀)。

最后,最好的跟踪方式可能是将 DTrace 探测器附加到objc_msgSend. 出于上述相同的尾调用原因,您将无法将 DTrace 探针附加到它的返回。

但更好的问题是你为什么要这样做。

于 2011-09-24T13:44:02.357 回答