2017-01-25 15 views
1

スタックは小さなアドレスに向かって成長するので、gdbでそれを調べるのは辛いです。私は(32ビットマシン上で以下の64個の言葉、この場合には)(スタックに)0xffffd0e8に位置値と、スタック上で、次の値を確認したい場合はこれまでのところ私はgdbのスタックを調べる正しい方法は何ですか?

x/64xw 0xffffd0e8-64*4 

を使用しています。

もっと簡単な方法はありますか?

また、スタック上のコンテンツに対応する変数名を自動的に付ける方法はありますか?または、1行に4つではなく1つの単語しか表示しないでください。

+1

代わりに 'x/64xw $ esp'を使うことを検討してください。 – Jester

+0

私は知っています。しかし時々、スタックの上にない現在のフレームを調べたいと思っています。 –

+0

ヘルパー機能を定義します。 – Jester

答えて

2

デバッグ情報が手元にない場合は、ABIを知っているだけでなく、GDBの助けを借りて手作業で読むことができますABIのみに基づくもの(バックトレースのようなものですが、発信者の名前は付けません)。

あなたがバイナリのデバッグ情報を持っている場合は、あなたが選択したスタックフレームのローカル変数を一覧表示するinfo localsを使用し、framebtinfo frameinfo frame <address>updownetcを使用して、スタック内を移動することができます。

実際にメモリに注釈を付けることはできませんが、できることはconvenience variablesを作成してGDB変数を動的に作成することです。

大容量のメモリを便利に読み込む方法については、printとキャストアドレスを使用するだけで非常に便利です。例:print (char(*)[]) 0xdeadbeef。また、大きな領域を印刷するにはartifical arraysを使用します。 GDBは連続した同一の値を集約し、均一なメモリ領域(実際にはスタックの場合ではない)を非常に明確かつ容易に読み取るようにします。

関連する問題