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(この例では () に)、ブレークポイントにコマンドを追加します (-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 に答える