【问题标题】:LLDB Python scripting in XcodeXcode 中的 LLDB Python 脚本
【发布时间】:2012-12-23 07:44:29
【问题描述】:

我刚刚发现了this LLDB 的便捷功能,它允许我编写 Python 脚本,当我在 LLDB 中的断点上时可以访问框架中的变量。但是我在 Xcode (v4.5.2) 中使用它时遇到了一些问题。首先,我找不到任何地方说明我应该将这些 Python 脚本保存在哪里,以便我可以从 LLDB 中的命令行导入它们。其次,在我在 LLDB 中输入script 后,键盘输入有点错误:退格键不会删除屏幕上的字符,而是有效地将其从命令中删除。所以输入primt<bsp><bsp><bsp>int 实际上意味着print,但它仍然会在终端上显示为primtint。这只是美学,但它很烦人!

谁能指出一些 Xcode 特定的资源,以便将 Python 与 LLDB 结合使用?

编辑:Here 是另一个有趣的链接,它说您可以使用 Python 为使用 Python 的变量创建自定义摘要,但我找不到与此相关的任何内容。

【问题讨论】:

    标签: python xcode scripting lldb


    【解决方案1】:

    不幸的是,在 Xcode、lldb 和 Python 解释器之间,交互式控制台存在一些问题。请在http://bugreport.apple.com/ 提交错误报告 - 我不知道是否已经有关于此特定问题的错误报告,尽管这里的一般问题是已知的。如果您正在探索交互式 python 脚本界面,您可能需要使用命令行 lldb 工具;效果更好。

    我将所有用于 lldb 的 python 脚本放在 ~/lldb 中。在我的~/.lldbinit 文件中,我将它们作为来源。例如,我有~/lldb/stopifcaller.py,它是

    import lldb
    
    # Use this like
    # (lldb) command script import ~/lldb/stopifcaller.py
    # (lldb) br s -n bar
    # (lldb) br comm add --script-type python -o "stopifcaller.stop_if_caller(frame, 'foo')" 1
    
    def stop_if_caller(current_frame, function_of_interest):
      thread = current_frame.GetThread()
      if thread.GetNumFrames() > 1:
        if thread.GetFrameAtIndex(1).GetFunctionName() != function_of_interest:
          thread.GetProcess().Continue()
    

    如果这是我想要的,我会将command script import 放在我的~/.lldbinit 文件中以自动加载它。这个特定的例子在断点 #1 中添加了一个 python 命令——当 lldb 在断点处停止时,它将查看调用函数。如果调用函数不是foo,会自动恢复执行。本质上,断点 1 只会在 foo() 调用 bar() 时停止。请注意,Xcode 4.5 lldb 在执行command script import ~/... 时可能存在问题——您可能需要输入主目录的完整路径(/Users/benwad/ 或其他)。我记不太清了——Xcode 4.5 存在一些波浪号扩展问题,这些问题已经修复了一段时间。

    您可以直接将简单类型摘要添加到您的~/.lldbinit。例如,如果我正在调试 lldb 本身,ConstString 对象通常只有一个我感兴趣的字段,即 m_string ivar。所以我有

    type summary add -w lldb lldb_private::ConstString -s "${var.m_string}"
    

    或者如果是 addr_t 类型,我总是希望将其格式化为十六进制,所以我有

    type format add -f x lldb::addr_t
    

    如果你想向 lldb 添加一个新命令,你应该有一个类似~/lldb/sayhello.py 的 python 文件,

    import lldb
    
    def say_hello(debugger, command, result, dict):
      print 'hello'
    
    def __lldb_init_module (debugger, dict):
      debugger.HandleCommand('command script add -f sayhello.say_hello hello')
    

    然后你会像这样将它加载到 lldb 中

    (lldb) comma script import  ~/lldb/sayhello.py
    (lldb) hello
    hello
    (lldb)
    

    大多数情况下,当您添加用 python 编写的命令时,您将使用 shlexoptparse 库,因此该命令可以进行选项解析,并且您将添加一个 __doc__ 字符串 - 我省略了这些内容以使示例简单。

    【讨论】:

    • 谢谢!帮助我入门的非常有用的信息。
    • 你的lldbpythonsn-ps 不会碰巧有一个 github 存储库吗? (我看了看没看到……想入手一个吗?)我觉得很有趣。
    • 我认为我们确实需要向 lldb 网站添加一个食谱风格的文档,其中包含一系列简单的问题及其解决方案——这可能是处理这类事情的最佳场所。虽然时间不够。 :(
    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 2013-08-30
    • 1970-01-01
    • 2015-09-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多