Python Xcode:通过LLDB脚本或其他方式显示Apple框架类的属性
通过各种资源,我发现您可以在LLDB中创建自定义描述,甚至自定义对象摘要。我还知道,我可以通过“添加表达式”来显示调试器对我们隐藏的Apple framework类的属性值 我想要的是显示框架类对象,就好像源代码可用于它一样。 一张图片比文字更能说明问题。。。到目前为止,我所拥有的:Python Xcode:通过LLDB脚本或其他方式显示Apple框架类的属性,python,xcode,debugging,sprite-kit,lldb,Python,Xcode,Debugging,Sprite Kit,Lldb,通过各种资源,我发现您可以在LLDB中创建自定义描述,甚至自定义对象摘要。我还知道,我可以通过“添加表达式”来显示调试器对我们隐藏的Apple framework类的属性值 我想要的是显示框架类对象,就好像源代码可用于它一样。 一张图片比文字更能说明问题。。。到目前为止,我所拥有的: 如您所见,我在作用域中有一个名为\u label的SKLabelNode。我在教程和之后,通过Python脚本在SKNode旁边添加了一个自定义摘要字符串(“这些是单词”) 我还可以看到\u label.fo
如您所见,我在作用域中有一个名为
\u label
的SKLabelNode
。我在教程和之后,通过Python脚本在SKNode
旁边添加了一个自定义摘要字符串(“这些是单词”)
我还可以看到\u label.fontName
和\u label.text
,但这只是因为我右键单击并手动为每个属性“添加表达式”
我的问题:
\u标签
对象,然后始终显示其fontName
,文本
,就像我手动添加表达式所做的那样。或者换句话说:它应该表现得好像该类有完整的源代码command addCustomExpressionsWithObject\u label
一般来说,让LLDB调试器显示来自Apple框架的类的(有文档记录的!)属性有多难 特别是对于Sprite Kit,我们没有得到任何关于SK*节点对象的信息,我不敢相信这没有像我一样困扰其他使用其他Apple框架的开发者。我希望有办法“修复”这个问题,但我能找到的一点信息让我觉得这要么是不可能的,要么是我疯狂地想看到更多关于Apple类对象的细节
PS:是的,我还研究并定制了Xcode 5.1的QuickLook功能。我为一些Sprite Kit类创建了一个函数,但它仍然不令人满意,因为它仅用作完整的类转储(但总比没有好)。如果您可以运行一个表达式来返回这些属性的值,您可以将合成子级提供程序添加到SKLabelNode,该提供程序的结果是将这些属性中的每个属性作为LabelNode本身的子级进行求值 有关所有这些的更多详细信息,请访问LLDB官方网站: 但是,请注意:现在,无论您在Xcode中停止运行,无论您的程序状态有多么损坏,LLDB都将尝试运行这些表达式。在理想情况下,这不会关闭调试器,但如果这些属性不只是读取某个字段,那么它肯定会在您的系统中造成奇怪的副作用 还要注意的是,表演不会令人兴奋。在涉及SKLabelNode的每个停止或步骤中,LLDB都会运行代码来计算这些属性的值(假设您的SKLabelNode已展开,并且子节点可见)
tl;dr调试器在默认情况下不显示这些属性是有原因的-如果您真的关心,请创建一个运行适当表达式的合成子提供程序只是为了让Enrico说的更清楚一点。。。从外部来看,属性访问始终是函数调用,即获取foo.bar的值实际上是调用[foo-bar]。这在实现中并不一定正确,备份和合成属性实际上只是花哨的ivar访问。但是在类的@implementation部分说明了这是否正确,并且您可能没有Apple的kit类的实现文件的调试信息。因此调试器必须调用getter函数。正如Enrico所说,调用函数是很昂贵的。好吧,感谢您指出“合成子对象”,现在至少我知道我应该关注这个广泛文档的哪一部分。Enrico,您确定Xcode支持Obj-C类型的合成子对象提供程序吗?它似乎总是向下钻取。当尝试在控制台中运行提供程序时,使用
createvaluefromformexpression
我得到ClangUserExpression::Execute调用,但未选择任何线程
。这是有意义的,因为lldb.thread
返回None
。无论如何,在控制台上,我们也可以做po
,这样对我们来说就不那么重要了。。是的,它确实支持它。我怎么知道?因为我维护了提供者,比如说NSArray。所以,是的,总的来说,它是有效的。至于您的具体情况,您不应该在格式化程序中使用lldb.thread。。您有一个SBValue传递给格式化程序,因此您可以请求它提供进程,然后请求进程提供当前线程,并使用-lldb.thread仅用于交互式脚本编写。