我刚刚发现了LLDB的this方便的功能,它使我能够编写Python脚本,当我在LLDB的断点时可以访问框架中的变量。但是,在Xcode(v4.5.2)中使用它时遇到一些问题。首先,我找不到任何地方说应该保留这些Python脚本,以便可以从LLDB的命令行导入它们。其次,在LLDB中键入script
后,键盘输入出现了一些错误:退格键不会删除屏幕上的字符,而是会从命令中有效删除它。因此,有效地输入primt<bsp><bsp><bsp>int
意味着print
,但在终端上仍会以primtint
的形式出现。这只是美学,但很烦人!
谁能指出我一些将Xcode与LLDB一起使用的Xcode特定资源?
编辑:Here是另一个有趣的链接,它说您可以使用Python使用Python创建变量的自定义摘要,但我找不到与此相关的任何内容。
最佳答案
不幸的是,在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
,它将自动恢复执行。本质上,只有foo()调用bar()时,断点1才会停止。请注意,在执行command script import ~/...
时,Xcode 4.5 lldb可能存在问题-您可能需要键入主目录的完整路径(/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__
字符串-为了使示例简单起见,我省略了这些内容。关于python - Xcode中的LLDB Python脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14232208/