在Xcode_3.1.2中进行调试时,我非常确定我能看到NSString数组的内容。但升级到3.2后我只看到以下内容......
我知道我可以使用“po planetArray”打印(gdb)中的对象,或者只需单击调试器并“将描述打印到控制台”我很好奇,因为我确信它在升级之前有效。有人知道这是什么一回事吗?
欢呼加里编辑:数据格式化程序已启用,它显示您在上面看到的内容...
答案 0 :(得分:18)
这是因为GDB就好像你正在查看的变量超出了范围,而实际上只是对数据格式化程序的每个部分函数或方法调用返回的内容感到困惑(数据格式化程序是“{(unichar *) )Xcode_CFStringSummary($ VAR,$ ID)}:s“你看到的部分。 在调试时,如果您知道局部变量现在必须在范围内,请打开调试器窗口以及可以看到“变量”,“值”和“汇总”列标题的区域双击您感兴趣的变量的“Summary”行条目并输入以下内容(对于NSArray或NSCFArray等数组类型):
“{(int)[$ VAR count]}个对象{(NSString *)[(NSArray *)$ VAR description]}: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”
它会告诉你所有你需要知道的事情。但它很难做到正确。在类上定义另一个方法并从数据格式化程序字符串而不是“描述”中调用它可能更容易且更不容易出错。
答案 1 :(得分:4)
在Run> Xcode中的变量视图菜单是否启用了“使用数据格式化程序”?
答案 2 :(得分:2)
我不确定这是否有帮助,但如果您选择要在调试器窗口中查看的数组值并转到菜单:运行>变量视图>查看变量为 你可以将它从“NSCFString *”更改为“NSString *”。然后,您会看到“Planet_1”这样的值。
干杯,
凯文