在Xcode中编写LLDB Python脚本

在Xcode中编写LLDB Python脚本,python,xcode,scripting,lldb,Python,Xcode,Scripting,Lldb,我刚刚发现了LLDB的便利特性,它允许我编写Python脚本,当我在LLDB中遇到断点时,可以访问帧中的变量。然而,在Xcode(v4.5.2)中使用它时,我遇到了一些问题。首先,我找不到任何地方说明我应该将这些Python脚本保存在哪里,以便从LLDB的命令行导入它们。其次,在我向LLDB中键入script后,键盘输入有点错误:backspace不会删除屏幕上的字符,但实际上会从命令中删除它。因此,键入primtint实际上意味着print,但在终端上仍然显示为primtint。这只是审美,但

我刚刚发现了LLDB的便利特性,它允许我编写Python脚本,当我在LLDB中遇到断点时,可以访问帧中的变量。然而,在Xcode(v4.5.2)中使用它时,我遇到了一些问题。首先,我找不到任何地方说明我应该将这些Python脚本保存在哪里,以便从LLDB的命令行导入它们。其次,在我向LLDB中键入
script
后,键盘输入有点错误:backspace不会删除屏幕上的字符,但实际上会从命令中删除它。因此,键入
primtint
实际上意味着
print
,但在终端上仍然显示为
primtint
。这只是审美,但它是相当恼人

有人能给我指一些特定于Xcode的资源来使用Python和LLDB吗


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

不幸的是,在Xcode、lldb和Python解释器之间,交互式控制台存在一些问题。请在提交错误报告-我不知道是否已经有关于这个特定问题的错误报告,尽管这里的问题一般都是已知的。如果您正在探索交互式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()
我会将
命令脚本导入
放在我的
~/.lldbinit
文件中,以自动加载它,如果这是我想要的。这个特定的示例向断点#1添加了一个python命令——当lldb在断点处停止时,它将查看调用函数。如果调用函数不是
foo
,它将自动恢复执行。本质上,只有当foo()调用bar()时,断点1才会停止。请注意,Xcode 4.5 lldb在执行
命令脚本导入时可能会出现问题~/…
——您可能需要键入主目录的完整路径(
/Users/benwad/
或其他内容)。我记不清了——Xcode 4.5有几个tilde扩展问题已经修复了一段时间

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

type summary add -w lldb lldb_private::ConstString -s "${var.m_string}"
或者,如果是类型
addr\u t
,我总是希望将其格式化为十六进制,因此

type format add -f x lldb::addr_t
如果您想向lldb添加一个新命令,您将有一个python文件,如
~/lldb/sayhello.py

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编写的命令时,您将使用
shlex
optparse
库,以便该命令可以进行选项解析,并且您将添加
\uuuu doc\uuuu
字符串-为了保持示例的简单,我省略了这些内容。

谢谢!非常有用的信息让我开始学习。您的
lldb
python
代码片段没有github回购协议,是吗?(我看了看,没有看到一个……想开始一个吗?)我觉得这很有趣。我认为我们真的需要在lldb网站上添加一个食谱式的文档,其中包含一些简单的问题及其解决方案-这可能是处理此类问题的最佳场所。不过时间不够(