2012-06-08 33 views
2

我想知道是否可以从bt命令中获得选定的项目。例如。找到某个功能的调用函数。 这个想法基本上是在有问题的函数处添加一个不间断断点,然后打印例如callstack调用函数,也可能是调用函数。 最后,这可能归结为过滤bt命令的结果。过滤将是必要的,以排除它们之间的框架和运行时方法。lldb:如何获取调用函数?

回答

5

你需要放入一个小Python脚本来做到这一点今天 - 这并不坏。

(lldb) br se -n mach_msg 
(lldb) br comm add -s python 1 
Enter your Python command(s). Type 'DONE' to end. 
> thread = frame.GetThread() 
> frnum = 0 
> for fr in thread.frames: 
> print '% 2d %s' % (frnum, fr.GetFunctionName()) 
> frnum = frnum + 1 
> frame.GetThread().GetProcess().Continue() 
> DONE 

我把我的断点(上mach_msg()在这个例子中),我添加一个命令到我的断点(-s python意味着它是写在脚本语言Python的;我加入这个命令断点#1 )。

Python代码自动提供当前断点对象和框架对象(请参阅lldb中的“help break command add”)。我从框架对象中获取当前线程,然后遍历该线程的堆栈帧。

lldb有很多关于这些python对象可以做什么操作的内置信息。例如

(lldb) script help (lldb.SBFrame) 
(lldb) script help (lldb.SBThread) 

参见http://lldb.llvm.org/python-reference.html

+0

哈,有朋友指出我错过了“命令”脚本类型,你可以把断点。你可以在没有Python的情况下使用“br comm add -s command 1”来执行此操作,然后选择你想要的任何lldb命令(“bt”,“c”)以及后面的“DONE”。 –

+0

我收到以下消息:“警告:没有命令附加到断点。” – Adobels