24

gdb でバイナリ ファイルをデバッグしています。Intel IA-32 で gcc によってコンパイルされた C コードでした。からこの出力を取得しましたobjdump。ここの最後の行に最も興味があります。

08048d9e <func_1>
8048d9e:    55                      push   %ebp
8048d9f:    89 e5                   mov    %esp,%ebp
8048da1:    83 ec 18                sub    $0x18,%esp
8048da4:    c7 44 24 04 88 99 04    movl   $0x8049988,0x4(%esp)
8048dab:    08 
8048dac:    8b 45 08                mov    0x8(%ebp),%eax
8048daf:    89 04 24                mov    %eax,(%esp)
8048db2:    e8 54 01 00 00          call   8048f0b <strings_not_equal>

この最後の行は、指定されたアドレスで見つかった値を比較すると思います: 8048f0b. 私は試みます:

(gdb) x 0x8048f0b

そして受け取る:

0x8048f0b <strings_not_equal>:  0x57e58955

アセンブリを間違って解釈していますか? これは、gdb でアドレスの値を読み取る正しい方法ですか? 私は、よりアスキーフレンドリーな16進値を見つけることを期待していました。比較される保存された文字列値を見つけることに興味があります。

また、この種のデバッグに使用したいお気に入りの GUI ツールはありますか? 私はdddを試してみることを考えていました。もっと簡単にデバッグする方法を見つけたいです。

4

1 に答える 1

33

メモリ アドレス の値を正しく読み取っています0x8048f0bが、この行call 8048f0b <strings_not_equal>は、このアドレスが関数 (と呼ばれるstrings_not_equal()) の開始であることを示しています。それが ASCII であるとは思わないでしょう。より多くのマシン コードであると予想されます。

への関数引数を探している場合strings_not_equal()、それらはスタックにプッシュされています。0x8(%ebp)最初の引数は、 の最初の引数であるからコピーされていますfunc1()。2 番目の引数は$0x8049988、おそらく文字列のアドレスです。

アドレスの内容を文字列として出力したい場合は、次のようにしますx/s:

x/s 0x8049988
于 2013-01-24T04:07:57.390 に答える