繁体   English   中英

如何在LLDB中使用浮点数作为参数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM