2009-10-18 19 views
10

w systemach Linux i Mac OS X Do debugowania aplikacji bez debugowania informacji mogę używać skryptów stepi i nexti.Debugowanie zdemontowanych bibliotek za pomocą gdb

Na Mac OS X gdb pokazuje funkcje, które są wywoływane wewnątrz biblioteki, chociaż czasami przesuwa kilka instrukcji asemblera w każdej instrukcji stepi.

W systemie Linux, po wejściu do biblioteki dynamicznej gdb zostaje utracony. Na przykład, w puts() istnieją trzy instrukcje asemblera wewnątrz puts(), gdy gdb osiągnie skok 0x080482bf, nie powiedzie się z komunikatem "Brak funkcji zawiera licznik programu dla wybranej klatki".

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. 

Czy wiesz, jak debugować te wywołania biblioteki za pomocą gdb.

+0

Która wersja gdb? –

+0

Co się stanie, gdy użyjesz stepi w Linuksie? Mówisz, że nie możesz w ogóle przejść przez instrukcje, ale nie opisujesz, co się właściwie dzieje. Czy możesz opublikować próbną sesję? –

+0

Dziękuję, używam Slackware 13.0 z preinstalowanym gdb 6.8. Wyjaśniłem, co się dzieje. – Freeman

Odpowiedz

12

Jeśli GDB nie ma symboli debugowania dla funkcji, którą próbujesz debugować, GDB nie będzie w stanie określić zakresu adresów pamięci do deasemblowania. Aby obejść ten problem, można przekazać zakres do polecenia disassemble. Na przykład:

(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. 

Może istnieć sposób zainstalowania symboli debugowania. W systemie Ubuntu zainstalowałem pakiet libc6-dbg, który pozwala mi wejść do funkcji w standardowej bibliotece.

+3

GNU gdb (GDB) 7.4.1-debian. Prawidłową składnią jest teraz 'disassemble 0x70c72d, 0x70c740'. To musi być przecinek. – golem

Powiązane problemy