6

LLDB のブレークポイントにいるときに、フレーム内の変数にアクセスできる Python スクリプトを作成できる、LLDB のこの便利な機能を発見しました。ただし、Xcode (v4.5.2) で使用すると、いくつかの問題が発生します。まず、LLDB のコマンド ラインからこれらの Python スクリプトをインポートできるように、これらの Python スクリプトをどこに保持する必要があるかを示す場所が見つかりません。第二に、scriptLLDB に入力した後、キーボード入力が少し間違っています。バックスペースは画面上の文字を削除しませんが、コマンドから効果的に削除します。したがって、入力するとprimt<bsp><bsp><bsp>int効果的に を意味しますが、端末ではprint引き続き表示されます。primtintこれは単なる審美的なものですが、かなり面倒です。

LLDB で Python を使用するための Xcode 固有のリソースを教えてもらえますか?

編集: Pythonを使用してPythonを使用して変数のカスタム集計を作成できるという別の興味深いリンクがありますが、それに関連するものは見つかりません

4

1 に答える 1

14

残念ながら、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 で記述されたコマンドを追加するときは、ライブラリshlexoptparseライブラリを使用して、コマンドがオプションの解析を実行できるようにし、__doc__文字列を追加します。例を単純にするために、これらのことは省略しました。

于 2013-01-10T01:24:43.077 に答える