2017-12-06 21 views
4

は私がRFLAGSがlldblldbを使ってフラグレジスタの出力を素早く得る方法はありますか?ここ

(lldb) register read rflags 
    rflags = 0x0000000000000246 

を使用して登録読んだとき、私は(各ビットは、特定のフラグを表し、私にそれらのフラグの値を与えた出力を持っていいだろう知ってもらう出力されます例:キャリーフラグ、ゼロフラグなど)

lldbを使用する方法はありますか?

+1

あなたはおそらくすでにgdb'はこれを持って '知っている:レイアウトreg''で、レジスタを示すTUIウィンドウは 'EFLAGSを含んで0x246 [PF ZF IF]'、それが変化したときにハイライト表示付き。 'info reg eflags'は同じことをします。また 'p $ eflags'はデコードされた結果を表示します。 'p/x $ eflags'はそれを数値で示しています。 (奇妙なことに、gdbは 'rflags'を認識せず、x86-64のreg名として' eflags'のみを認識します。) –

答えて

2

これを行う自動方法はありません。

データフォーマッタはタイプにリンクされており、フラグレジスタタイプは存在しないため、データフォーマッタは使用できません。そして、コマンドラインでregister readに渡すことができるフォーマットは、全体の値をフォーマットします。

データフォーマッタと同じ行に「レジスタフォーマッタ」を追加するというアイデアはありましたが、まだ実装されていません。

しかし、かなり簡単に値を出力するlldbコマンドを書くことができます。あなたはここの例から始める場合:

http://llvm.org/svn/llvm-project/lldb/trunk/examples/python/cmdtemplate.py

あなたが例を見ることができるが、ここでフレームを取得します。

rflags_value = frame.FindRegister("rflags") 

frame = exe_ctx.GetFrame() 

あなたは、その後からレジスタ値を得ることができますあなたは全体として値を得ることができます

error = lldb.SBError() 
uint_value = rflags_value.GetValueAsUnsigned(error) 

しかし、あなたの目的は、このためにSBDATAを取得することが容易になるかもしれません:

data_value = rflags_value.GetData() 

SBDATAオブジェクトを使用すると、UINT8年代のベクトルとしての価値を見ることができます。それは小さな塊を生成しませんが、それでもこれは役立つかもしれない:

first_byte = data_value.uint8[0] 

など、あなたが望むように、あなたがこれをフォーマットしたときに、あなたが渡された戻りオブジェクトに説明を書き、それはコマンドが返すものです。 __initセクションは、これをlldbコマンドにする方法を示しています。その後、次のように入力してください:

command script import <path_to_py>/my_command.py 

今後のすべてのlldbセッションで利用できるようになります。ここで

はlldbのAPIの上のより多くのドキュメントです:

http://lldb.llvm.org/python_reference/index.html

、あなたがコードを開発しているとして、あなたは、これらのAPIのと遊ぶのがlldbの「スクリプトインタプリタ」REPL(scriptコマンド)のpythonを使用することができます。

0

これまでの説明では、組み込みの方法はありませんが、スクリプトを作成することはできます。

だから、私はそれのためのlldbのpythonスクリプトを作った。

flags/eflags/rflagsをサポートしていますが、カスタムコマンドを追加できます。

Here, on my gist

関連する問題