Debugging 在调试器中更改结果

Debugging 在调试器中更改结果,debugging,lldb,Debugging,Lldb,我正试图修复iPhone应用程序中的一个bug,并发现自己处于这种情况下。 实例变量myView的类型为MYTextView,MYTextView是UITextView的子类 在调试器中,我在一行中输入了几次:p myView.text 从下面可以看出,奇怪的是我得到了不同的结果: (lldb) p myView.text (NSString *) $34 = 0x095da870 @"พี(the-date-in-Thai-Language) 05" (lldb) p myView.text

我正试图修复iPhone应用程序中的一个bug,并发现自己处于这种情况下。 实例变量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包含我期望的结果,其他行在expect字符串的末尾包含垃圾

我不明白这个不断变化的垃圾怎么会在这里,当我应该在调试器中暂停的时候。 还有一件事是,我只是在泰语方面遇到了这种问题


有人知道会发生什么吗?

这看起来像是NSString数据格式化程序中的一个错误。 你使用的是Xcode 4.6吗?如果是这样的话,我希望你能在尽可能多的上下文中对Xcode提出一个bug。
我的猜测是有一些缓冲区管理不当。

当您使用
p
命令时,lldb可以做一些不同的事情

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

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

早期版本(和gdb)可能会在您的程序中运行代码来格式化字符串,并且程序可能会在这个过程中发生一些变化。为了确保这种情况不会发生,我们做了很多工作,但这种可能性是存在的


Enrico怀疑
NSString
的内置python格式化程序函数可能在您的程序中出现某种错误,并在重新调用格式化程序时提供更改的字符串摘要。请务必在提交一份错误报告,详细说明如何重现此行为。

在这种情况下,最好是我制作一个小程序,使其易于解释。我遵循上面的建议,构建了一个示例项目,并制作了一个bug报告。太棒了!这是确保它得到修复的最好方法——我认为没有其他人碰到过这个问题。