OC底层探索(十三):打印消息msgSendLog

开启log

image.png

  • log_and_fill_cache,函数里,我们看到了objcMsgLogEnabled这个变量,显然都objcMsgLogEnabled = true时,系统可以打印msgSend的日志
  • 我们找到其赋值的地方

image.png

  • 显然我们调用instrumentObjectMessageSends方法可以对其进行赋值

image.png

  • 日志存储的位置/tmp/msgSends-%d

使用

  • 当前只在mac程序中使用, 模拟器还没找到解决方法
  • 声明 extern void instrumentObjcMessageSends(BOOL flag);
extern void instrumentObjcMessageSends(BOOL flag);

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        instrumentObjcMessageSends(YES);
        WLWPerson *person = [WLWPerson alloc];
        [WLWPerson say666];
        instrumentObjcMessageSends(NO);
        NSLog(@"Hello, World!");
    }
    return 0;
}
复制代码
  • 然后在系统的tmp目录下

image.png

  • 可以看到对应的log日志

image.png

  • 可以看到整个objc_msgSend流程
  • resolveClassMethod -> resolveInstanceMethod -> forwardingTargetForSelector->methodSignatureForSelector -> resolveInstanceMethod -> doesNotRecognizeSelector
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享