在调试器中更改结果

时间:2013-05-19 07:41:53

标签: debugging lldb

我正在尝试修复iPhone应用中的错误,并发现自己面对这种情况。 实例变量myView的类型为MYTextView,而MYTextView是UITextView的子类。

在调试器中,我连续几次输入:p myView.text 如下所示,奇怪的是,我得到了不同的结果:

(lldb) p myView.text
(NSString *) $34 = 0x095da870 @"พี(the-date-in-Thai-Language)
05"
(lldb) p myView.text
(NSString *) $35 = 0x0a2c5620 @"พี(the-date-in-Thai-Language)
"
(lldb) p myView.text
(NSString *) $36 = 0x09515f60 @"พี(the-date-in-Thai-Language)
щ"
(lldb) p myView.text
(NSString *) $37 = 0x09515f80 @"พี(the-date-in-Thai-Language)
㏀ड़ख़筀ज़툠ज़梐
⨈Ⴊ"
(lldb) p myView.text
(NSString *) $38 = 0x0a2c3800 @"พี(the-date-in-Thai-Language)
妜샷फ़"
(lldb) p myView.text
(NSString *) $39 = 0x095e7010 @"พี(the-date-in-Thai-Language)
"

结果高于$ 35和$ 39包含我期望的结果,其他行包含期望字符串末尾的垃圾。

我不明白这个变化的垃圾是如何在这里的,当我应该在调试器内部暂停时。 还有一件事是我只有泰语才会遇到这种问题。

有没有人知道会发生什么事?

2 个答案:

答案 0 :(得分:0)

这看起来像NSString的数据格式化程序中的错误。 你在Xcode 4.6上吗?如果是这样的话,如果您在尽可能多的情况下提交了针对Xcode的错误,我会很高兴。 我的猜测是有一些缓冲区无法正常管理。

答案 1 :(得分:0)

当你使用p命令时,lldb可以做几件事。

对于简单的具体类型(intint *),它只能打印变量中的值(10,0xffffffff83021600)。它可能具有格式化程序首选项集(例如,以十六进制显示int)。它可能有一个更复杂的python格式化程序(它可以读取内存的不同部分并向您呈现对象的高级视图)。最后,它可能实际上在您的程序中运行代码,以提供该变量的高级视图。

在这种情况下,使用Xcode 4.6,这看起来像一个简单的NSString ivar,因此期望lldb可以将其内置的python格式化程序用于NSString对象。这个内置格式化程序查看对象内存,并知道如何重构实际字符串以便显示而无需在程序中运行任何代码。在这种情况下,不应修改字符串的内容。

早期版本(和gdb)可能会在程序中运行代码来格式化字符串,并且程序可能会在此过程中稍微改变一下。有很多工作要做,以确保不会发生,但存在这种可能性。

Enrico怀疑NSString的内置python格式化程序函数可能在您的程序中以某种方式行为不端,并提供在重新调用格式化程序时更改的字符串摘要。请在http://bugreport.apple.com/处提交错误报告,并提供有关如何重现此行为的详细信息。