objective-c – 是否有可能在dtrace中获得objc方法的结果?

objective-c – 是否有可能在dtrace中获得objc方法的结果?,第1张

概述我写了一个动作,当任何objc方法返回时触发(objc ::: return). 现在,我需要获得返回值.可能吗? 总结:不,您无法在DTrace探针中获取Objective-C方法的返回值. Bill Bumgarner有一个post on tracing messages to nil,其中他说: Aside: objc_msgSend()‘s return cannot be traced 我写了一个动作,当任何objc方法返回时触发(objc ::: return).
现在,我需要获得返回值.可能吗?解决方法 总结:不,您无法在DTrace探针中获取Objective-C方法的返回值.

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 0x4d283Returning 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 0x7fcd92414ea0Returning from -[NSPlaceholderString initWithData:enCoding:]    return value = 0x600

如您所见,地址(即返回值)不匹配.实际上,0x600是kcfStringEnCodingASCII的值,它是NSASCIIStringEnCoding的Core Foundation对应物.在某些时候,方法调用的方法或函数将0x600移动到RAX,这是DTrace错误地认为是返回值的值.

总结

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239836.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存