Python Xcode:通过LLDB脚本或其他方式显示Apple框架类的属性

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

通过各种资源,我发现您可以在LLDB中创建自定义描述,甚至自定义对象摘要。我还知道,我可以通过“添加表达式”来显示调试器对我们隐藏的Apple framework类的属性值

我想要的是显示框架类对象,就好像源代码可用于它一样。

一张图片比文字更能说明问题。。。到目前为止,我所拥有的:



如您所见,我在作用域中有一个名为
\u label
SKLabelNode
。我在教程和之后,通过Python脚本在
SKNode
旁边添加了一个自定义摘要字符串(“这些是单词”)

我还可以看到
\u label.fontName
\u label.text
,但这只是因为我右键单击并手动为每个属性“添加表达式”

我的问题:

  • 是否可以(如果可以)通过Python LLDB脚本将对象的属性添加到其树视图中?我想要的是展开
    \u标签
    对象,然后始终显示其
    fontName
    文本
    ,就像我手动添加表达式所做的那样。或者换句话说:它应该表现得好像该类有完整的源代码

  • 或者:是否有一种方法可以从脚本中运行“添加表达式”,以便我可以创建一个可以快速添加多个表达式的别名?也许我可以在其中添加有问题的对象作为参考,例如
    command addCustomExpressionsWithObject\u label

  • 我也接受其他解决方案。例如,如果我可以为每个SK*节点类编写代理类,并以某种方式让LLDB显示节点对应的代理类的内容,那么这也会起作用。无论什么都能完成任务,最好是以自动化的方式(一旦实现)


    一般来说,让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仅用于交互式脚本编写。