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