11 votes

Déboguer des bibliothèques désassemblées avec gdb

Sur Linux et Mac OS X, je peux utiliser stepi et nexti pour déboguer une application sans informations de débogage.

Sous Mac OS X, gdb montre les fonctions qui sont appelées à l'intérieur de la bibliothèque, bien qu'il arrive parfois à avancer plusieurs instructions d'assembleur à chaque instruction stepi.

Sous Linux, lorsque je rentre dans une bibliothèque dynamique, gdb se perd. Par exemple, avec puts(), il y a trois instructions d'assembleur à l'intérieur de puts(), une fois que gdb atteint le saut à 0x080482bf, il échoue avec le message "Aucune fonction ne contient le compteur de programme pour le cadre sélectionné".

0x080482ba in puts@plt ()
(gdb) disassemble
Dump of assembler code for function puts@plt:
0x080482b4 :        jmp    *0x8049580
0x080482ba :        push   $0x10
0x080482bf :       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.

Savez-vous comment déboguer ces appels de bibliothèque avec gdb ?

13voto

Mike Points 6080

Si GDB n'a pas de symboles de débogage pour la fonction que vous essayez de déboguer, GDB ne pourra pas déterminer la plage d'adresses mémoire à désassembler. Pour contourner cela, vous pouvez passer la plage dans la commande disassemble. Par exemple:

(gdb) p $pc
$4 = (void (*)()) 0x70c72d <_IO_puts+29>
(gdb) disassemble 0x70c72d 0x70c740
Dump du code assembleur de 0x70c72d à 0x70c740:
0x0070c72d <_IO_puts+29>:   mov    %eax,(%esp)
0x0070c730 <_IO_puts+32>:   call   0x721f10 
0x0070c735 <_IO_puts+37>:   mov    0x84c(%ebx),%edx
0x0070c73b <_IO_puts+43>:   cmpw   $0x0,(%edx)
0x0070c73f <_IO_puts+47>:   mov    %edx,-0x10(%ebp)
Fin du dump de l'assembleur.

Il existe peut-être un moyen d'installer des symboles de débogage. Sur mon système Ubuntu, j'ai installé le paquet libc6-dbg, ce qui me permet de rentrer dans les fonctions de la bibliothèque standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X