C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了objective-c – 是否有可能在dtrace中获得objc方法的结果?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个动作,当任何objc方法返回时触发(objc ::: return).
现在,我需要获得返回值.可能吗?

解决方法

总结:不,您无法在DTrace探针中获取Objective-C方法的返回值.

Bill Bumgarner有一个post on tracing messages to nil,其中他说:

博客文章相当陈旧(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调用的@L_450_14@(例如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对应物.在某些时候,方法调用方法或@L_450_14@将0x600移动到RAX,这是DTrace错误地认为是返回值的值.

大佬总结

以上是大佬教程为你收集整理的objective-c – 是否有可能在dtrace中获得objc方法的结果?全部内容,希望文章能够帮你解决objective-c – 是否有可能在dtrace中获得objc方法的结果?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。