2012-04-27 14 views
10

gdbが、たとえば、特定のリニアアドレスに読み書きする機能が用意されていますgdbで論理アドレスを使用するには?

(gdb) x/1wx 0x080483e4 
0x80483e4 <main>:  0x83e58955 
(gdb) 

のが、どのように論理アドレスを指定すればいいのですか? GDBに、または私はxコマンドで使用できるリニアアドレスにこの論理アドレスを翻訳:

0x0804841a <+6>:  mov %gs:0x14,%eax 

がどのように私は「0x14の%GS」のメモリを読むことができます:私は、次の命令accrossに来ましたの?

注:私は単にこの命令の後に%eaxにを読むことができることを知っているが、それは、私は「%のGS:0x14に」のメモリを読み取ることができますどのように私の懸念

+0

[セグメントを解決する方法:GDBのオフセットアドレス](http://stackoverflow.com/questions/4006686/how-to-resolve-segmentoffset-adres-in-gdb)の可能な複製。それは良い答えがありません。 – Job

答えて

4

ではありませんGDB

GDBには、%gsが参照するセグメントがどのように設定されているかを知る方法がありません。

またはこの論理アドレスは、私は再びxコマンドで

を使用することができ、あなたは一般的にこれを行うことはできませんリニアアドレスに変換します。しかし、あなたは32ビットx86 Linux上にいるようです。です。%gsは、set_thread_areaシステムコール経由でスレッド記述子を指すように設定されています。

GDBでcatch syscall set_thread_areaを実行し、パラメータを調べることができます(各スレッドはそのような呼び出しを1つ持ちます)。実際に行うコードはhereです。 %gsがどのように設定されているか分かったら、0x32をbase_addrに追加するだけです。

+0

良い答え。残念ながら、私のプログラムはset_thread_area(2)を呼び出さないようです。ここでソースコードを見ることができます:http://pastebin.com/us5sbzVg(コンパイルオプションはソースコードで提供されています)。 – user368507

+1

@ user368507プログラムにはスレッドが1つしかありません。 *プログラムは 'set_thread_area'を呼び出します(あなたは' strace'の下でそれを見ることができます)。私はGDBでその呼び出しを捕まえることができました。 'set_thread_area'が呼び出されていないと主張する理由を確かめないでください。 –

+0

私の間違い。私はOPの後に別のコンピュータを使いました。それはx86-64だった...あなたはanwserは32ビットx86上で完璧に動作します。私は、x86-64ではものが違うと思う。 – user368507

関連する問題