【问题标题】:Intelligent Obj-C variable contents while debugging in Xcode?在 Xcode 中调试时智能 Obj-C 变量内容?
【发布时间】:2011-03-16 00:20:59
【问题描述】:

在其默认(即,我的)配置中,Xcode 在其调试器窗口中对变量(尤其是常见的 Objective-C 集合种类的变量)的调试器窗口有些无用。

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

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

我最近花时间在 Eclipse 调试 Java,尽管它的所有错误,Eclipse 都知道所有 Java 集合,并且在你找到它时从字符串或集合的内容或任何其他内容中进行简单的单行转储在调试器中。

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

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

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

【问题讨论】:

  • 如果我理解正确,我认为这将是一个很棒的功能(如果它存在我也想知道) - 但这不应该妨碍调试,因为 gdb 控制台及其所有 CLI荣耀可以倾倒任何你需要的东西。 :)

标签: objective-c xcode debugging


【解决方案1】:

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

您的代码中的NSStringNSNumberNSArrayNSDictionary 值,带有断点:

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

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

【讨论】:

  • 是的,感谢您提供更新的答案。在过去的几年里,Xcode 在默认显示方面的这些改进慢慢地进行了改进——在 2010 年,令人震惊的是默认设置的无用性。
  • Print Description 上下文菜单项是否有键盘快捷键?
【解决方案2】:

我会查看特殊的 GDB 输出(如 Gobra 所述),以及显示模板。

显示的东西看起来很复杂,但实际上很简单 - 这是 makign NSIndexPath display "Sec:x Row:y" 的示例:

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

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

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

{[myClass description]}:s

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

【讨论】:

    【解决方案3】:

    是的,调试期间的 XCode 变量查找很弱,但它是基于 gdb 的,您可以通过控制台对其进行控制。在调试期间打开控制台并编写您需要的任何命令,以查看 NSDictionary* dic;内容就这么简单

    po dic
    

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

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

    您可以在 gdb 帮助中获得更多信息

    【讨论】:

    • +1 谢谢戈布拉。我将编辑问题以强调我希望使用非命令行解决方案,但我知道这可能是最好的解决方案,不幸的是。
    • 在完整调试器窗口的“变量”窗格中右键单击变量会显示“将描述打印到控制台”命令,相当于 po。 (这实际上调用了-debugDescription,默认情况下调用-description,但被覆盖以提供更详细的信息,例如集合。)
    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2013-03-05
    • 1970-01-01
    相关资源
    最近更新 更多