lldb:如何获取调用函数?

时间:2012-06-08 09:30:43

标签: objective-c llvm lldb

我想知道是否可以从bt命令中获取所选项目。例如。找到某个函数的调用函数。 这个想法基本上是在所讨论的函数中添加一个不间断的断点,然后打印callstack,例如调用函数,也许是调用函数。 最后,这可能归结为过滤bt命令的结果。过滤将是必要的,以排除其间的框架和运行时方法。

1 个答案:

答案 0 :(得分:6)

今天你需要使用一些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对象做什么操作的内置信息。 e.g。

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

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