11

LinuxおよびMacOSXIでは、stepiおよびnextiを使用して、情報をデバッグせずにアプリケーションをデバッグできます。

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

Linuxでは、ダイナミックライブラリにステップインするとgdbが失われます。たとえば、puts()では、puts()内に3つのアセンブラ命令があり、gdbが0x080482bfでジャンプに達すると、「関数に選択されたフレームのプログラムカウンタが含まれていません」というメッセージが表示されて失敗します。

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

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

4

1 に答える 1

13

デバッグしようとしている関数のデバッグシンボルが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、標準ライブラリの関数にステップインできるパッケージをインストールしました。

于 2009-10-24T08:51:36.660 に答える