不幸的是,在 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 添加新命令,您将拥有一个类似的 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
库,以便命令可以进行选项解析,并且您将添加一个__doc__
字符串 - 我省略了这些内容以保持示例简单。