2013-01-09 9 views
5

LLDBの便利な機能であるthisを発見したので、LLDBのブレークポイントにいるときに、フレーム内の変数にアクセスできるPythonスクリプトを書くことができます。しかし、私はXcode(v4.5.2)でそれを使用する際にいくつか問題があります。まず、これらのPythonスクリプトをどこに置いて、LLDBのコマンドラインからインポートできるのかを知ることができません。次に、scriptをLLDBに入力すると、キーボード入力が少し間違っています。バックスペースは画面上の文字を削除しませんが、効果的にコマンドから削除します。したがって、primt<bsp><bsp><bsp>intと入力するとprintを意味しますが、それでも端末にはprimtintと表示されます。これはちょうど美的ですが、それは非常に迷惑です!LLDB XcodeでのPythonスクリプティング

誰かがLLDBでPythonを使用するためのXcode固有のリソースを指摘できますか?

EDIT:Hereは、Pythonを使用してPythonを使用して変数のカスタムサマリーを作成することができるという興味深いリンクですが、それに関連するものは何も見つかりません。

答えて

13

XcodeとlldbとPythonインタプリタの間には、残念なことに、対話型コンソールにいくつかの問題があります。 http://bugreport.apple.com/にバグレポートを提出してください - この特定の問題に関するバグレポートが既にあるかどうかはわかりませんが、一般的な問題はわかっています。インタラクティブなPythonスクリプティングインタフェースを調べる場合は、コマンドラインlldbツールを使用することができます。それがうまくいく。

lldbのすべてのPythonスクリプトを~/lldbに入れました。私の~/.lldbinitファイルでは、私はそれらを調達。例えば、私はそれは私が望んだ場合、私は、それを自動的にロードするために、私の~/.lldbinitファイルにcommand script importを置く

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() 

ある~/lldb/stopifcaller.pyを持っています。この特定の例では、Pythonコマンドをブレークポイント#1に追加します。lldbがブレークポイントで停止すると、呼び出し元の関数を調べます。呼び出し元の関数がfooでない場合、自動的に実行を再開します。本質的に、ブレークポイント1は、foo()がbar()を呼び出す場合にのみ停止します。 command script import ~/...でXcode 4.5 lldbに問題がある可能性があることに注意してください。ホームディレクトリ(/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だ場合、私はいつもあなたがlldbに新しいコマンドを追加したい場合は、フォーマットの六角ように、私は

type format add -f x lldb::addr_t 

を持っていることをしたい、あなたのpythonを持っているでしょう

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/sayhello.pyのようなファイルと、あなたは

のようlldbしそれをロードします

あなたはPythonで書かれたコマンドを追加しているときに、コマンドオプションの解析を行うことができますので、あなたがshlexoptparseライブラリを使用します、そしてあなたが__doc__文字列を追加しますほとんどの時間 - 私は維持するためにそれらのものを省略単純な例です。

+0

ありがとうございます!私を始めるための非常に有用な情報。 – benwad

+0

'lldb'' python'スニペットを使ってgithubリポジトリを作成することはありませんか? (私は見て、1つ見ていない...ファンシーなものを開始?)私はそれが非常に興味深いと思う。 – trojanfoe

+5

私は本当にこのようなことのための最良の場所になるだろう、簡単な問題の集まりとその解決策を使って、lldbのWebサイトにcookbook形式の文書を追加する必要があると思います。しかし、時間の欠如。 :( –

関連する問題