解决方法
Bill Bumgarner有一个post on tracing messages to nil,其中他说:
Aside:
objc_msgSend()
‘s return cannot be traced via dtrace at this time. Not surprising given that the function doesn’t actually return — as far as dtrace is concerned,it is nothing but preamble.
博客文章相当陈旧(2008年1月),它使用pid提供程序,而不是objc提供程序.也就是说,从Mac OS X v10.7.1开始它仍然有效,它也适用于objc提供程序.
有趣的是,它似乎有时可行但它取决于DTrace何时读取RAX寄存器.由于objc_msgSend()没有返回,因此DTrace最终使用RAX中已由代码存储的值,这些值不一定是被跟踪方法的返回值.
请考虑以下代码:
NSNumber *n = [NSNumber numberWithInt:1234]; printf("n has address %p\n",n);
以及以下探测:
objc$target:NSPlaceholderNumber:-initWithInt?:return { printf("Returning from -[NSPlaceholderNumber initWithInt:]\n"); printf("\treturn value = 0x%p\n",(void *)arg1); }
使用DTrace运行时,我得到以下输出:
n has address 0x4d283 Returning from -[NSPlaceholderNumber initWithInt:] return value = 0x4d283
所以看起来探测器能够捕获-initWithInt的返回值:这只是运气,可能是由-initWithInt调用的函数(例如CFNumberCreate()或CFMakeCollectable())引起的,最终将预期值放在RAX中.
现在考虑以下代码:
char *c = "hello"; NSData *data = [NSData dataWithBytes:c length:strlen(c)]; Nsstring *s = [[Nsstring alloc] initWithData:data encoding:NSASCIIStringEncoding]; printf("s has address %p\n",s);
以及以下探测:
objc$target:NSPlaceholderString:-initWithData?encoding?:return { printf("Returning from -[NSPlaceholderString initWithData:encoding:]\n"); printf("\treturn value = 0x%p\n",我得到以下输出:s has address 0x7fcd92414ea0 Returning from -[NSPlaceholderString initWithData:encoding:] return value = 0x600如您所见,地址(即返回值)不匹配.实际上,0x600是kcfStringEncodingASCII的值,它是NSASCIIStringEncoding的Core Foundation对应物.在某些时候,方法调用的方法或函数将0x600移动到RAX,这是DTrace错误地认为是返回值的值.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。