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

时间:2013-03-20 18:39:26

标签: iphone xcode cocoa-touch gdb lldb

我正在调试UIProgressView。具体来说,我正在呼叫-setProgress:-setProgress:animated:

当我使用以下方式在LLDB中调用它时:

p (void) [_progressView setProgress:(float)0.5f]

progressView以进度值0结束。显然,LLDB无法正确解析浮点值。

知道如何让LLDB正确解析浮动参数吗?

顺便说一句,我在GDB中遇到了同样的问题。

2 个答案:

答案 0 :(得分:1)

在Xcode 4.5及之前,这是一个常见问题。如果我没记错的话,那里真正发生的是旧的C无原型类型促销规则生效了。如果您传递浮点值,则其类型为double。如果你传递一个整数值,它就作为int传递,那是一种东西。如果你写了(float)0.8f,lldb会占用(浮点数)的4个字节并将它们传递给读取8个字节的东西并将其解释为double。

在Xcode 4.6中,lldb将从Objective-C运行时获取参数类型(如果可以的话),因此它知道参数实际上是在这里使用浮点数。你甚至不需要(浮动)演员。

我的猜测是,当你给lldb一个指向对象p (void) [0x260da630 setProgress:...的指针时,表达式解析器不会看对象的isa来获取类&从中获取类型。只要您将一个强制转换添加到对象地址,它就会获得类型。

当你为gdb编写setProgress:(float)0.8f时,我想到,它会将此作为一个特殊的指示,即这个参数是一个浮点类型 - 本质上,你提供的是原型。这是我认为lldb的表达式解析器将来应该做的事情,但clang用于完成所有表达式解析的事实意味着将这些非标准含义强加于其中会更难。 (当然,已经有一些,例如p $r0作品;)

答案 1 :(得分:0)

发现问题。实际上,我的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也有帮助......