Ken*_*tzo 7 objective-c dtrace
我写了一个动作,当任何objc方法返回时触发(objc ::: return).现在,我需要获得返回值.可能吗?
小智 5
总结:不,您无法在DTrace探针中获取Objective-C方法的返回值.
Bill Bumgarner有一篇关于追踪消息的帖子,其中他说:
旁白:此时
objc_msgSend()无法通过dtrace追溯.鉴于函数实际上没有返回,这并不奇怪 - 就dtrace而言,它只不过是序言.
博客文章相当陈旧(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);
Run Code Online (Sandbox Code Playgroud)
以及以下探测:
objc$target:NSPlaceholderNumber:-initWithInt?:return
{
printf("Returning from -[NSPlaceholderNumber initWithInt:]\n");
printf("\treturn value = 0x%p\n", (void *)arg1);
}
Run Code Online (Sandbox Code Playgroud)
使用DTrace运行时,我得到以下输出:
n has address 0x4d283
Returning from -[NSPlaceholderNumber initWithInt:]
return value = 0x4d283
Run Code Online (Sandbox Code Playgroud)
所以似乎探测器能够捕获到的返回值-initWithInt:.这只是运气,可能是由一个被调用的函数(例如CFNumberCreate()或者CFMakeCollectable())引起的-initWithInt:,最终将预期值放在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);
Run Code Online (Sandbox Code Playgroud)
以及以下探测:
objc$target:NSPlaceholderString:-initWithData?encoding?:return
{
printf("Returning from -[NSPlaceholderString initWithData:encoding:]\n");
printf("\treturn value = 0x%p\n", (void *)arg1);
}
Run Code Online (Sandbox Code Playgroud)
使用DTrace运行时,我得到以下输出:
s has address 0x7fcd92414ea0
Returning from -[NSPlaceholderString initWithData:encoding:]
return value = 0x600
Run Code Online (Sandbox Code Playgroud)
如您所见,地址(即返回值)不匹配.实际上,0x600的值kCFStringEncodingASCII是Core Foundation的对应物NSASCIIStringEncoding.在某些时候,方法调用的方法或函数将0x600移动到RAX,这是DTrace 错误地认为是返回值的值.
| 归档时间: |
|
| 查看次数: |
747 次 |
| 最近记录: |