gpt4 book ai didi

ios - 记录在设备上发送的 Objective-c 消息

转载 作者:可可西里 更新时间:2023-11-01 04:41:37 24 4
gpt4 key购买 nike

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

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

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

这可能吗?

最佳答案

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

问题是 Apple 有意在 native iOS SDK 中隐藏了该函数,因此您不能直接调用它。

但它在运行时仍然存在于 dylib 中,因此您始终可以这样做:

#include <dlfcn.h>

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,如您链接到的帖子中所述。

关于ios - 记录在设备上发送的 Objective-c 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25515730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com