残念ながら、Xcode、lldb、および Python インタープリターの間には、対話型コンソールにいくつかの問題があります。http://bugreport.apple.com/でバグ レポートを提出してください。この特定の問題に関するバグ レポートが既にあるかどうかはわかりませんが、一般的な問題は既知です。インタラクティブな Python スクリプト インターフェイスを調べている場合は、コマンド ライン lldb ツールを使用することをお勧めします。その方がうまくいきます。
lldb 用のすべての Python スクリプトを に入れました~/lldb
。私の~/.lldbinit
ファイルでは、それらをソースにしています。たとえば、~/lldb/stopifcaller.py
どちらが
import lldb
# Use this like
# (lldb) command script import ~/lldb/stopifcaller.py
# (lldb) br s -n bar
# (lldb) br comm add --script-type python -o "stopifcaller.stop_if_caller(frame, 'foo')" 1
def stop_if_caller(current_frame, function_of_interest):
thread = current_frame.GetThread()
if thread.GetNumFrames() > 1:
if thread.GetFrameAtIndex(1).GetFunctionName() != function_of_interest:
thread.GetProcess().Continue()
command script import
それが必要な場合は、自動的にロードするように~/.lldbinit
ファイルに入れます。この特定の例では、python コマンドをブレークポイント #1 に追加します。lldb がブレークポイントで停止すると、呼び出し元の関数が調べられます。呼び出し元の関数が でない場合はfoo
、自動的に実行が再開されます。基本的に、ブレークポイント 1 は、foo() が bar() を呼び出した場合にのみ停止します。Xcode 4.5 lldb で問題が発生する可能性があることに注意してください。ホーム ディレクトリ (またはその他)command script import ~/...
へのフル パスを入力する必要がある場合があります。/Users/benwad/
はっきりとは覚えていませんが、Xcode 4.5 にはいくつかのチルダ展開の問題があり、しばらくの間修正されていました。
単純なタイプの要約を~/.lldbinit
直接追加できます。たとえば、lldb 自体をデバッグしている場合、ConstString
通常、オブジェクトには、m_string ivar という 1 つのフィールドしか関心がありません。ので、私は持っています
type summary add -w lldb lldb_private::ConstString -s "${var.m_string}"
または、それがタイプの場合addr_t
、私は常にそれを16進数としてフォーマットしたいので、
type format add -f x lldb::addr_t
lldb に新しいコマンドを追加する場合は、次のような python ファイルが必要です~/lldb/sayhello.py
。
import lldb
def say_hello(debugger, command, result, dict):
print 'hello'
def __lldb_init_module (debugger, dict):
debugger.HandleCommand('command script add -f sayhello.say_hello hello')
そして、あなたはそれをlldbにロードします
(lldb) comma script import ~/lldb/sayhello.py
(lldb) hello
hello
(lldb)
ほとんどの場合、Python で記述されたコマンドを追加するときは、ライブラリshlex
とoptparse
ライブラリを使用して、コマンドがオプションの解析を実行できるようにし、__doc__
文字列を追加します。例を単純にするために、これらのことは省略しました。