[英]How can I use a float as an argument in LLDB?
我正在调试UIProgressView
。 具体来说,我叫-setProgress:
和-setProgress:animated:
当我使用以下方法在LLDB中调用它时:
p (void) [_progressView setProgress:(float)0.5f]
progressView最终的进度值为0。显然,LLDB无法正确解析float值。
知道如何获取LLDB正确解析的float参数吗?
顺便说一句,我在GDB中遇到了同样的问题。
在Xcode 4.5及更高版本中,这是一个常见问题。 如果我没记错的话,真正发生的事情是旧的C no-prototype类型提升规则已经生效。 如果传递的是浮点值,则其类型为double。 如果您要传递一个整数值,那么它将作为int传递。 如果您编写了(float)0.8f,则lldb会占用(float)的这4个字节,并将它们传递给读取8个字节并将其解释为double的对象。
在Xcode 4.6中,如果可能的话,lldb将从Objective-C运行时获取参数类型,因此它知道该参数确实在此处浮动。 您甚至都不需要(float)强制转换。
我的猜测是,当您给lldb一个指向对象p (void) [0x260da630 setProgress:...
的指针时,表达式解析器不会查看对象的isa来获取类并从中获取类型。 一旦将强制类型转换添加到对象地址,它就会得到类型。
我认为,当您为gdb编写setProgress:(float)0.8f
,将以此作为该参数是浮点类型的特殊指示-本质上,您是在提供原型。 我认为lldb的表达式解析器将来应该做些事情,但是使用clang进行所有表达式解析的事实意味着,将这些非标准含义塞进去有点困难。 (当然已经有一些了,例如p $r0
有效;)
找到了问题。 实际上,我的LLDB命令看起来略有不同:
p (void) [0x260da630 setProgress:(float)0.8f animated:NO]
其中0x260da630
是我的UIProgressView。 显然,调试器确实需要知道接收对象的确切类型,并且不接受参数的强制转换,因此
p (void) [(UIProgressView*)0x260da630 setProgress:(float)0.8f animated:NO]
作品。 (即使强制转换为id
也是不够的!)
感谢您的评论,Martin R和Martin Ullrich,并为您为了更好的可读性而打断我的问题表示歉意!
顺便说一句,我发誓,我也使用了属性而不是地址。 但是也许重启Xcode也有帮助...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.