在构建之前向类文件添加代码 - 目标C.

时间:2011-09-21 05:30:19

标签: iphone objective-c xcode precompiling

我正在寻找一个框架,我不想深入了解它。

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

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

谢谢和问候,


丹尼斯,

Your answer在许多论坛中最有用。 非常感谢。

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

我正在寻找的是提供额外的构建,它将记录用户所遵循的步骤,以便更容易重现这些问题。

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

如上所述,我将研究DTrace和objc_msgSend。如果你有任何首选的教程,我会谷歌出去,这将很棒。

谢谢和问候, :d

1 个答案:

答案 0 :(得分:1)

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

Apple没有提供这样的内容。您必须自己添加跟踪工具。如果您的源代码样式是一致的,这可能相对容易自动执行,例如在以减号(或加号)开头的行之后搜索第一个左大括号......

或者,您可能希望使用公共Objective-C运行时函数来枚举所有类及其所有方法,然后使用另一个类NSLog进行方法调换,然后再跳转到原始类。

或者,您可以采用objc_msgSend的开源实现,并在开头插入对NSLog的调用。请注意,obj_msgSend尾调用方法,这样可以防止您在返回时添加调用。当然要准备好大量的输出。您可能希望将对NSLog的调用调整为objc_msgSend的selector参数值(例如公共前缀)。

最后,跟踪的最佳方法可能是将DTrace探针附加到objc_msgSend的条目。对于上面提到的相同尾调用原因,您将无法将DTrace探针附加到其返回。

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