Log Objective-c消息在设备上发送

时间:2014-08-26 21:49:36

标签: ios objective-c iphone objective-c-runtime

在模拟器中运行iOS应用程序时,会有一个环境变量NSObjCMessageLoggingEnabled导致所有objc_msgSend次调用都被注销到文件中。 (Detailed explanation)。

我正在尝试追踪我的应用中发送的所有消息,但我无法在模拟器中运行它。它必须在物理设备上,因为我通过闪电连接器与硬件进行交互。出于同样的原因,我无法将调试器附加到该过程。

将日志写入磁盘(如使用NSObjCMessageLoggingEnabled创建的日志)会很有帮助,但是在我的应用程序的Documents目录中将其写入本地,或者类似。

这可能吗?

1 个答案:

答案 0 :(得分:4)

所有NSObjCMessageLoggingEnabled会导致CoreFoundation在启动和关闭时自动调用instrumentObjcMessageSends

问题是Apple故意在原生iOS SDK中隐藏了该功能,因此您无法调用它。

但它在运行时仍存在于dylib中,因此您始终可以执行此操作:

typedef void functype(BOOL);
void *libobjc = dlopen("/usr/lib/libobjc.dylib", RTLD_LAZY);
functype *instrumentObjcMessageSends = dlsym(libobjc, "instrumentObjcMessageSends");
if (!instrumentObjcMessageSends) {
    NSLog(@"Couldn't get instrumentObjcMessageSends");
    exit(1);
}
instrumentObjcMessageSends(YES);
NSLog(@"Did it");

我不知道在哪里写日志(如果有的话)。我假设您要打电话logObjcMessageSends注册您自己的ObjCLogProc,如您关联的帖子中所述。