在Xcode中调试时智能Obj-C变量内容?

时间:2010-07-14 18:12:18

标签: objective-c xcode debugging

在默认(即我的)配置中,Xcode在变量的调试器窗口中有点无用,特别是那些常见的Objective-C集合。

当我展开一些对象时,调试器似乎通常想要显示底层的Obj-C结构,所以我正在查看isa s和类层次结构。

但是我几乎总是想要的东西对于对象本身而言在语义上是有意义的。例如。对于NSDictionary,理想情况下我希望看到一个键/值列表。如果这些键和值是,例如NSString s,我只想查看字符串值,而不是复杂的嵌套对象。 NSSetNSArraysNSData内的字节也是如此。并且NSString虽然通常在摘要列中获取它们的字符串表示,但是当它们很长时(例如,一个太长而无法放入列中的路径名似乎不会滚动)也无法查看 - 当我双击它时,我得到显示模板字符串,所以我也不能选择/复制它。

我最近花了一些时间在Eclipse上调试Java,并且由于它的所有缺点,Eclipse知道所有Java集合,并且在字符串或集合的内容中有一个简单的单行转储,或者当你发现它时在调试器中。

有没有办法在Xcode中获得这个?我错过了一些明显的东西,还是应该潜入显示模板系统?我知道那里有一些支持,因为NSArrays似乎得到一种特殊的列表格式,NSDictionaries获得“2键/值对”摘要等。

编辑:可以放入GDB以获取更多关于对象的数据。我很沮丧,GDB的po作用于NSDictionary给出了我期望从GUI调试器获得的那种非常有用的输出。可以在没有上下文切换到控制台的情况下复制吗?

我非常喜欢Xcode环境,但是我一直使用的对象几乎完全不透明,这确实阻碍了调试时间。感谢。

3 个答案:

答案 0 :(得分:4)

是的,在调试期间查找的XCode变量很弱,但是它基于gdb而你可以控制它以为控制台。在调试期间打开控制台并编写您需要的任何命令,以查看NSDictionary * dic;内容就像

一样简单
po dic

po打印[obj description]结果中显示的数据。您也可以调用任何方法,如

po [dict valueForKey:@"myKey"], or p(NSRect) [[self view] frame]

您可以获得更多gdb帮助

答案 1 :(得分:4)

我会看两个特殊的GDB输出(如Gobra所说),还有显示模板。

显示内容看起来很复杂但实际上非常简单 - 这是makign NSIndexPath显示“ Sec:x Row:y ”的示例:

Sec:{(int)[$VAR section]}  Row:{(int)[$VAR row]} 

因此,您可以为任何对象类型打印描述性文本和多个值。显示变量适用于该类型的所有类,并且在XCode运行之间以及跨项目之间保持不变。

最后要注意的一件事是,对于任何返回字符串的内容,您需要在“{}”对之后添加“:s”,如下所示:

{[myClass description]}:s

如果您需要清除显示模板,只需单击要编辑的行并将其全部删除 - 您将返回默认值。因此,为任何对象快速创建临时格式化程序非常容易,可以让您准确地看到感兴趣的内容。

答案 2 :(得分:1)

在Xcode 6中,这个功能似乎已经实现了?在2010年提出这个问题时,我无法谈论Xcode的功能。

代码中的

NSStringNSNumberNSArrayNSDictionary值,带有断点:

variables in code

当断点断开时,您可以在Xcode“变量视图”中看到值。对于集合,您可能需要展开详细信息箭头:

values in the debugger

如果右键单击变量并选择"Print Description of variable_name",则对象的-debugDescription / -description值将打印到控制台。这对于更复杂的集合通常很有用,可能对于长NSString个值等也是有用的。

Screen shot in Xcode 7 of “Print Description” context-menu item

printed to the console.