0

我正在调试一个UIProgressView. 具体来说,我正在调用-setProgress:and -setProgress:animated:

当我在 LLDB 中调用它时,使用:

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

progressView 的进度值为 0。显然,LLDB 没有正确解析浮点值。

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

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

4

2 回答 2

1

在 Xcode 4.5 及之前的版本中,这是一个常见问题。如果我没记错的话,真正发生的是旧的 C 无原型类型提升规则生效。如果你传递一个浮点值,它的类型是 double。如果你传递一个整数值,它会作为 int 传递,诸如此类。如果您编写 (float)0.8f,lldb 将获取 (float) 的这 4 个字节并将它们传递给读取 8 个字节并将其解释为双精度的东西。

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

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

认为,当您为 gdb 编写代码时setProgress:(float)0.8f,它会将此作为一个特殊指示,表明该参数是一个浮点类型——本质上,您是在提供原型。这是我认为 lldb 的表达式解析器应该在未来一段时间内做的事情,但是使用 clang 来完成所有表达式解析的事实意味着将这些非标准的含义硬塞进去有点困难。(当然,已经有一些p $r0作品了;)

于 2013-03-22T03:01:26.747 回答
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 也有帮助……</p>

于 2013-03-20T19:27:03.313 回答