3

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

4

1 回答 1

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在本例中为 on ()),我在断点中添加了一个命令(-s python意味着它是用脚本语言 python 编写的;我正在将此命令添加到断点 #1)。

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

lldb 有很多关于您可以对这些 python 对象执行哪些操作的内置信息。例如

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

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

于 2012-09-28T05:31:45.113 回答