2
我想知道是否可以从bt
命令中获得选定的项目。例如。找到某个功能的调用函数。 这个想法基本上是在有问题的函数处添加一个不间断断点,然后打印例如callstack调用函数,也可能是调用函数。 最后,这可能归结为过滤bt
命令的结果。过滤将是必要的,以排除它们之间的框架和运行时方法。lldb:如何获取调用函数?
我想知道是否可以从bt
命令中获得选定的项目。例如。找到某个功能的调用函数。 这个想法基本上是在有问题的函数处添加一个不间断断点,然后打印例如callstack调用函数,也可能是调用函数。 最后,这可能归结为过滤bt
命令的结果。过滤将是必要的,以排除它们之间的框架和运行时方法。lldb:如何获取调用函数?
你需要放入一个小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)
哈,有朋友指出我错过了“命令”脚本类型,你可以把断点。你可以在没有Python的情况下使用“br comm add -s command 1”来执行此操作,然后选择你想要的任何lldb命令(“bt”,“c”)以及后面的“DONE”。 –
我收到以下消息:“警告:没有命令附加到断点。” – Adobels