web-dev-qa-db-fra.com

Afficher les instructions d'assemblage en cours dans la BDG

Je suis en train de faire un débogage au niveau de l’assemblée dans GDB. Existe-t-il un moyen de faire en sorte que GDB me montre l’instruction Assembly en cours de la même manière qu’elle affiche la ligne source en cours? La sortie par défaut après chaque commande ressemble à ceci:

0x0001433f      990         Foo::bar(p);

Cela me donne l'adresse de l'instruction en cours, mais je dois continuer à me référer à la sortie de disassemble afin de voir quelle instruction est en cours d'exécution.

162
JSBձոգչ

Vous pouvez passer à la disposition de l’assemblage dans GDB:

(gdb) layout asm

Voir ici pour plus d'informations. L'instruction d'assemblage actuelle sera affichée dans la fenêtre de l'assembleur.

   ┌───────────────────────────────────────────────────────────────────────────┐
   │0x7ffff740d756 <__libc_start_main+214>  mov    0x39670b(%rip),%rax        #│
   │0x7ffff740d75d <__libc_start_main+221>  mov    0x8(%rsp),%rsi              │
   │0x7ffff740d762 <__libc_start_main+226>  mov    0x14(%rsp),%edi             │
   │0x7ffff740d766 <__libc_start_main+230>  mov    (%rax),%rdx                 │
   │0x7ffff740d769 <__libc_start_main+233>  callq  *0x18(%rsp)                 │
  >│0x7ffff740d76d <__libc_start_main+237>  mov    %eax,%edi                   │
   │0x7ffff740d76f <__libc_start_main+239>  callq  0x7ffff7427970 <exit>       │
   │0x7ffff740d774 <__libc_start_main+244>  xor    %edx,%edx                   │
   │0x7ffff740d776 <__libc_start_main+246>  jmpq   0x7ffff740d6b9 <__libc_start│
   │0x7ffff740d77b <__libc_start_main+251>  mov    0x39ca2e(%rip),%rax        #│
   │0x7ffff740d782 <__libc_start_main+258>  ror    $0x11,%rax                  │
   │0x7ffff740d786 <__libc_start_main+262>  xor    %fs:0x30,%rax               │
   │0x7ffff740d78f <__libc_start_main+271>  callq  *%rax                       │
   └───────────────────────────────────────────────────────────────────────────┘
multi-thre process 3718 In: __libc_start_main     Line: ??   PC: 0x7ffff740d76d
#3  0x00007ffff7466eb5 in _IO_do_write () from /lib/x86_64-linux-gnu/libc.so.6
#4  0x00007ffff74671ff in _IO_file_overflow ()
   from /lib/x86_64-linux-gnu/libc.so.6
#5  0x0000000000408756 in ?? ()
#6  0x0000000000403980 in ?? ()
#7  0x00007ffff740d76d in __libc_start_main ()
   from /lib/x86_64-linux-gnu/libc.so.6
(gdb)
287
ks1322

Tu peux faire

display/i $pc

et chaque fois que GDB s’arrête, il affiche le désassemblage de la prochaine instruction.

GDB-7.0 prend également en charge set disassemble-next-line on, qui désassemblera la ligne suivante dans son intégralité et vous donnera davantage de détails sur le contexte de désassemblage.

132
Employed Russian

La commande

x/i $pc

peut être configuré pour fonctionner tout le temps en utilisant le mécanisme de configuration habituel.

41
bmargulies

Paramétrer l'option suivante:

set  disassemble-next-line on
show disassemble-next-line

Vous donnera des résultats qui ressemblent à ceci:

(gdb) stepi
0x000002ce in ResetISR () at startup_gcc.c:245
245 {
   0x000002cc <ResetISR+0>: 80 b5   Push    {r7, lr}
=> 0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
   0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0
(gdb) stepi
0x000002d0  245 {
   0x000002cc <ResetISR+0>: 80 b5   Push    {r7, lr}
   0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
=> 0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0
34
Bob Ensink

Si vous souhaitez que les prochaines instructions s'affichent automatiquement lors de la progression du programme, vous pouvez utiliser la commande display comme suit -

display /3i $pc

Ce qui précède affichera 3 instructions chaque fois qu'un point d'arrêt est atteint ou lorsque vous procédez pas à pas le programme.

Plus de détails sur l'entrée du blog ici .

27
mohit

Depuis gdb, appuyez sur Ctrlx2 et l’écran se divisera en 3 parties.

La première partie vous montrera le code normal en langage de haut niveau.

La seconde vous montrera l’équivalent de l’Assemblée et le instruction Pointer correspondant.

Troisième vous présentera l'invite gdb normale pour entrer des commandes.

See the screen shot

19
abhi

Tableau de bord GDB

https://github.com/cyrus-and/gdb-dashboard

Cette configuration GDB utilise l’API officielle GDB Python pour nous montrer ce que nous voulons chaque fois que GDB s’arrête après, par exemple next, un peu comme TUI.

Cependant, j'ai constaté que cette implémentation est une alternative plus robuste et configurable au mode TUI GDB intégré, comme expliqué à: vue gdb avec code

Par exemple, nous pouvons configurer GDB Dashboard pour afficher le désassemblage, la source, les registres et la pile avec:

dashboard -layout source Assembly registers stack

Voici à quoi cela ressemble si vous activez toutes les vues disponibles:

enter image description here