2009-10-18 17 views
10

LinuxおよびMac OS X stepiおよびnextiを使用して、デバッグ情報なしでアプリケーションをデバッグすることができます。gdbで逆アセンブルされたライブラリのデバッグ

Mac OS Xの場合、gdbはライブラリ内で呼び出される関数を表示しますが、各stepi命令でいくつかのアセンブラ命令を進めることもあります。

Linuxでは、動的ライブラリに入るとgdbが失われます。たとえば、puts()にはputs()内に3つのアセンブラ命令があり、gdbが0x080482bfでジャンプすると、 "No function for select frame for program counter"というメッセージで失敗します。

0x080482ba in [email protected]() 
(gdb) disassemble 
Dump of assembler code for function [email protected]: 
0x080482b4 <[email protected]+0>:  jmp *0x8049580 
0x080482ba <[email protected]+6>:  push $0x10 
0x080482bf <[email protected]+11>:  jmp 0x8048284 <_init+48> 
End of assembler dump. 
(gdb) stepi 
0x080482bf in [email protected]() 
(gdb) stepi 
0x08048284 in ??() 
(gdb) disassemble 
No function contains program counter for selected frame. 

これらのライブラリ呼び出しをgdbでデバッグする方法を知っていますか。

+0

gdbのどのバージョンですか? –

+0

また、Linuxでstepiを使用するとどうなりますか?あなたは指示を一歩も進めることはできないと言っていますが、実際に何が起こったのかは記述していません。サンプルセッションを投稿できますか? –

+0

ありがとうございます、私はgack 6.8がプリインストールされたSlackware 13.0を使用しています。 私は何が起こるかを明確にしました。 – Freeman

答えて

12

GDBにデバッグしようとしている関数のデバッグシンボルがない場合、GDBは逆アセンブルするメモリアドレスの範囲を判断できません。この問題を回避するには、範囲をdisassembleコマンドに渡すことができます。例:

(gdb) p $pc 
$4 = (void (*)()) 0x70c72d <_IO_puts+29> 
(gdb) disassemble 0x70c72d 0x70c740 
Dump of assembler code from 0x70c72d to 0x70c740: 
0x0070c72d <_IO_puts+29>: mov %eax,(%esp) 
0x0070c730 <_IO_puts+32>: call 0x721f10 <strlen> 
0x0070c735 <_IO_puts+37>: mov 0x84c(%ebx),%edx 
0x0070c73b <_IO_puts+43>: cmpw $0x0,(%edx) 
0x0070c73f <_IO_puts+47>: mov %edx,-0x10(%ebp) 
End of assembler dump. 

デバッグシンボルをインストールする方法があります。私のUbuntuシステムでは、パッケージlibc6-dbgをインストールしました。標準ライブラリの関数にステップインできます。

+3

GNU gdb(GDB)7.4.1-debian。正しい構文は 'disassemble 0x70c72d、0x70c740'です。それはカンマでなければならない。 – golem

関連する問題