【问题标题】:Xcode 3.2 Debug: Seeing whats in an array?Xcode 3.2 调试:查看数组中的内容?
【发布时间】:2009-10-15 16:43:03
【问题描述】:

在 Xcode_3.1.2 中进行调试时,我很确定我可以看到我的 NSString 数组的内容。但是升级到 3.2 后,我只看到以下内容...

我知道我可以使用“po planetArray”在 (gdb) 中打印对象,或者只需单击调试器并“将描述打印到控制台”我只是好奇,因为我确信它在升级之前可以工作。有人知道这是什么一回事吗?

干杯加里

编辑:数据格式化程序已打开,它显示了您在上面看到的内容...

【问题讨论】:

    标签: xcode debugging


    【解决方案1】:

    这是因为 GDB 表现得好像您正在查看的变量超出范围,而实际上它只是对数据格式化程序的每个部分函数或方法调用返回的内容感到困惑(数据格式化程序是“{(unichar * )Xcode_CFStringSummary($VAR, $ID)}:s" 你看到的部分。 当您正在调试并且您处于一个知道局部变量现在必须在范围内的方法中时,打开调试器窗口并在您可以看到“变量”、“值”和“摘要”列标题的区域双击您感兴趣的变量的“摘要”行条目并输入以下内容(对于 NSArray 或 NSCFArray 等数组类型):

    "{(int)[$VAR count]} 个对象 {(NSString *)[(NSArray *)$VAR 描述]}:s"

    然后按回车键。您现在已经用您自己的数据格式化程序字符串覆盖了 Xcode 的 GDB 扩展提供的默认数据格式化程序(可在“/Developer/Library/Xcode/CustomDataViews/”的各种 plist 中找到)。

    您自己的覆盖保存在“~/Library/Application Support/Developer/Shared/Xcode/CustomDataViews/CustomDataViews.plist”,如果您想恢复 Apple 默认数据格式化程序,只需双击该变量的行相同的类型并删除那里的任何内容。

    具体细节:在上面的自定义表达式中,“{}”构造告诉 GDB 执行命令(就像您从 GDB 的调试器命令行执行命令一样,这意味着同样的限制适用:您需要指定在每个返回某些内容的函数或方法前面的强制转换括号中的返回类型)。右花括号后面的 ":s" 告诉 Xcode 和 GDB 引用 "Summary" 列。同样有效的是“:v”,它引用了“值”列,大部分时间它只是指针值。大括号之外的所有内容都会逐字显示。 不幸的是,大括号不能嵌套,这会使三元运算符条件无效。

    因此,使用上述数据格式化程序,您应该会看到空 NSArray 的以下内容:

    “0 个对象 (\n)”

    如果您想将自己的数据格式化程序编写为 GDB 扩展(相当于指定类似于上述 Xcode_CFStringSummary 的函数),您可以这样做。看看下面的标题:“/Developer/Applications/Xcode.app/Contents/PlugIns/GDBMIDebugging.xcplugin/Contents/Headers/DataFormatterPlugin.h”

    它会告诉你所有你需要知道的。但很难做到正确。仅在您的类上定义另一个方法并从数据格式化程序字符串而不是“描述”中调用它可能更容易且不易出错。

    【讨论】:

    • 另一件似乎对我使用数据格式化程序的调试体验产生影响的事情是,像 NSCFArray 和 NSArray 这样的无工具桥接类集群似乎依赖于一个名为“CustomDataViews.plist”的文件在“/Developer/Library/Xcode/CustomDataViews/CarbonDataFormatters.bundle”中,但在包中找不到它。如果您在 Console.app 上看到有关缺少数据格式化程序的错误消息,请尝试将 plist 从捆绑包外部放置到其他(显然较新的)plist(例如,在“/Developer/Library/Xcode/CustomDataViews”中)。不知道这是否是一个错误......
    【解决方案2】:

    在 Xcode 的 Run > Variables View 菜单中,是否启用了“Use Data Formatters”?

    【讨论】:

      【解决方案3】:

      我不确定这是否有帮助,但如果您选择希望在调试器窗口中查看的数组值并转到菜单:运行 > 变量视图 > 将变量查看为 您可以将其从“NSCFString *”更改为“NSString *”。然后您会看到例如“Planet_1”的值。

      干杯,

      凯文

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        • 1970-01-01
        • 2010-09-11
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多