在调试器中打印字符串会显示其地址,而不是其内容

时间:2013-11-14 04:47:56

标签: objective-c debugging lldb

为什么我会看到内存地址而不是" test"我刚刚添加到NSMutableArray的字符串?如何查看实际的对象内容?

(lldb) p [autocompleteUrls addObject:@"test"]
(lldb) p [autocompleteUrls objectAtIndex:0]
(id) $8 = 0x00006e28

我还尝试将其强制转换为NSString,但却出错了

(lldb) p (NSString*)autocompleteUrls[1]
error: C-style cast from 'id' to 'NSString' is not allowed

2 个答案:

答案 0 :(得分:6)

在LLDB中 “p”是“打印”非物体的捷径 “po”是打印对象的“print-object”的快捷方式

你可能想要的是:
“po autocompleteUrls”
那将打印autocompleteUrls对象的内容

“p [autocompleteUrls addObject:@”test“]”
打印返回void的方法调用的结果。

要获得一个好的教程,请参阅Cocoa Is My Girlfriend:Xcode LLDB Tutorial

答案 1 :(得分:2)

这是Zaph优秀答案的技术扩展,只是为了让事情看起来不那么神奇......

lldb p命令打印您为其提供的表达式的内存内容,无论表达式是否解析为对象或其他某种数据类型。

例如,如果你有一个带有ivar p *object的ObjC对象将打印ivars。

lldb po命令评估您为其提供的表达式,而不是直接打印它,它首先尝试在其上调用debugDescription方法。如果对象的类没有实现该方法,那么它将尝试调用description方法,最后如果对象是CF对象,它将尝试CFShow

对于真正令人讨厌的lldb实际上做的是调用基因例程_NSPrintForDebugger传入返回的指针,该函数是实现上述逻辑的...

因此,对象的差异是p打印对象的实际内容,po打印该类的实现者认为适合您查看的对象的描述。当然,大多数套件对象都是非常不透明的,因此实际内容通常不是很有用,这就是添加描述方法的原因。