GDBマシンインタフェースを使用して、特定の変数の基本型を取得する方法はありますか?たとえば、型がuint32_t(types.hから)の変数を持っている場合、GDBにその変数の基本型が符号なしlong intか、あるいはuint32_tがtypedefされていることを伝える方法があります符号なしlong intに?GDB/MIを使用して変数の基本型を取得する方法
1
A
答えて
8
あなたが "whatisは" コマンド
は、私は、GDB/MIについてほとんど知っているあなたは
typedef unsigned char BYTE;
BYTE var;
(gdb)whatis var
type = BYTE
(gdb)whatis BYTE
BYTE = unsigned char
0
があるとし使用することができます。次のハックは、MI '-interpreter-exec'コマンドから呼び出し可能な状態で、MIを回避するためにPythonを使用します。おそらくあなたが想像していたものではないでしょう。
私はMIのドキュメントでは何もわかりませんでした-var-info-typeはあなたが望むことをしていないようですが、これはバグ8143と似ています(またはバグ8143が実装されていれば可能です) :
http://sourceware.org/bugzilla/show_bug.cgi?id=8143
パート1:あなたはpythonで何をしたいんコマンドを実装します。
# TODO figure out how to do this without parsing the the normal gdb type = output
class basetype (gdb.Command):
"""prints the base type of expr"""
def __init__ (self):
super (basetype, self).__init__ ("basetype", gdb.COMMAND_OBSCURE);
def call_recursively_until_arg_eq_ret(self, arg):
x = arg.replace('type = ', "")
x = gdb.execute("whatis " + x, to_string=True)
if arg != x:
x = self.call_recursively_until_arg_eq_ret(x).replace('type = ', "")
return x
def invoke (self, arg, from_tty):
gdb.execute("ptype " + self.call_recursively_until_arg_eq_ret('type = ' + arg).replace('type = ', ""))
basetype()
パート2:コンソールインタプリタ
source ~/git/misc-gdb-stuff/misc_gdb/base_type.py
&"source ~/git/misc-gdb-stuff/misc_gdb/base_type.py\n"
^done
-interpreter-exec console "basetype y"
~"type = union foo_t {\n"
~" int foo;\n"
~" char *y;\n"
~"}\n"
^done
-interpreter-exec console "whatis y"
~"type = foo\n"
^done
パート3使用してそれを実行します。
お知らせパート2あなたの出力の全ての制限は標準出力ストリームに起こっています。それが受け入れられない場合は、gdbの2番目の出力チャンネルをインターフェイスで使用するためにフックし、Pythonで書き込むことができます。ツイスト・マトリックスやファイルを使用しています。
ここではツイストマトリックスを使用した例ですが、必要に応じて 'basetype'出力を指示するためにそれを切り替えてください。 https://gitorious.org/misc-gdb-stuff/misc-gdb-stuff/blobs/master/misc_gdb/twisted_gdb.py
そうでなければ、私が想定しているstdoutストリームを解析することができます。 希望があれば幸いです。
関連する問題
- 1. 基本クラスのジェネリック型パラメータを取得する方法は?
- 2. javaローカル変数 - インデックスを使用して変数名または型を取得する方法
- 3. ストアドプロシージャを使用して出力変数の数を取得する方法は?
- 4. Blendを使用して基本グリッドを作成する方法
- 5. テンプレートの基本クラスを基本クラスの引数として使用するクラス
- 6. jOOQを使用してトランザクション内の基本接続を取得するには?
- 7. PythonとFlaskを使用してリクエスト変数の値を取得する方法
- 8. 基本クラスから派生クラス名を取得する方法
- 9. HTTP基本認証からパスワードを取得する方法
- 10. リフレクションを使用して引数名を取得する方法
- 11. Kaminariを使用してページ数を取得する方法
- 12. マゼンタでカスタム変数を使用してメタ記述を取得する方法
- 13. PHPでPOSTを使用して変数を取得する方法
- 14. ブーストライブラリを使用してシステム環境変数を取得する方法は?
- 15. セッションIDを使用してセッション変数を取得する方法
- 16. イベントをバックボーンの基本変数にバインドする方法は?
- 17. 使用可能な変数としてPHPを使用してmysqlカラムの合計を取得する方法
- 18. ポストバックから変数を取得してJsonQueryで使用する方法
- 19. チームエクスプローラの基本的な使用方法
- 20. JQuery変数として行数を取得する方法
- 21. htmlの値を取得する方法5 jqueryを使用して複数のファイルをアップロードする変数?
- 22. hibernateの基本型を使用するGrails
- 23. ironrubyの基本クラスのプロパティ(変数)にアクセスする方法は?
- 24. C#の基本クラスから派生型を取得しますか?
- 25. マクロを使用してHaxe関数のパラメータ型を取得する最適な方法は何ですか?
- 26. 関数の本体を文字列として取得する方法は?
- 27. Pythonを使用してScapyから変数を取得する
- 28. chrome.storage.getを使用して変数を取得する
- 29. Emailmessageクラスを使用してメッセージ本文を取得する
- 30. EF Code First:基本型を取得するとすべての派生型テーブルが照会されます
FWIW、これは通常「基本タイプ」ではなく「基本タイプ」と呼ばれ、AFAIKです。申し訳ありませんが、答えはありません。 –
Quibble: 'uint32_t'は、 ''または ''です。 –