Aktuelle Montageanleitung in GDB anzeigen


179

Ich mache ein Debugging auf Assembly-Ebene in GDB. Gibt es eine Möglichkeit, GDB dazu zu bringen, mir die aktuelle Montageanweisung auf dieselbe Weise anzuzeigen wie die aktuelle Quellzeile? Die Standardausgabe nach jedem Befehl sieht folgendermaßen aus:

0x0001433f      990         Foo::bar(p);

Dies gibt mir die Adresse des aktuellen Befehls, aber ich muss immer wieder auf die Ausgabe von zurückgreifen, disassembleum zu sehen, welchen Befehl ich gerade ausführe.


Antworten:


314

Sie können in GDB zum Baugruppenlayout wechseln:

(gdb) layout asm

Sehen Sie hier für weitere Informationen. Die aktuelle Montageanweisung wird im Assembler-Fenster angezeigt.

   ┌───────────────────────────────────────────────────────────────────────────┐
   │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)

1
@greatwolf, sieht so aus, als hättest du keine tui-unterstützung in deiner gdb. Weitere Informationen finden Sie in dieser Frage: stackoverflow.com/q/6706838/72178 .
ks1322

9
Ordentlich! Kann ich jetzt ein ähnliches Fenster für die Register haben? In der Tat kann ich:layout regs
Jens

Siehe auch gdb docs für andere TUI-Befehle , z. B. tui reg vectorzum Anzeigen der Vektorregs anstelle der Ganzzahlregs. (Nicht immer sehr benutzerfreundlich, da Sie nicht nur das .v8_int16oder etwas auswählen können , sodass die Anzeige ein großes Durcheinander darstellt.) Im x86-Tag-Wiki finden Sie eine kurze Anleitung zum Debuggen von asm.
Peter Cordes

Das ist über eine nutzlose Funktion und Ausgabe. Die verstümmelten C ++ - Namen sind zu lang und alles, was ich anzeigen möchte, befindet sich rechts außerhalb des Bildschirms. Was für eine dumme Entscheidung (standardmäßig kein ASM anzuzeigen, wenn si) und was für eine nutzlose Funktion (Ansichtsfenster, in dem nicht die erforderlichen Informationen angezeigt werden). Es macht keinen Sinn, diese Antwort
abzustimmen,

1
In ähnlicher Weise, ·layout srcum den Quellcode beim Debuggen zu sehen und sich auch daran zu erinnern, diesen Modus zu verlassenCTRL+x+a
Baiyan Huang

149

Du kannst tun

display/i $pc

und jedes Mal, wenn GDB stoppt, wird die Demontage der nächsten Anweisung angezeigt.

GDB-7.0unterstützt auch set disassemble-next-line on, wodurch die gesamte nächste Zeile zerlegt wird und Sie mehr über den Zerlegungskontext erfahren.


1
Wie aktivieren wir diese Funktion, wenn wir sie verwenden si(aber nicht s)?
JWW

53

Der Befehl

x/i $pc

kann so eingestellt werden, dass sie mit dem üblichen Konfigurationsmechanismus ständig ausgeführt wird.


28
Und x/ni $pcdie nächsten n Anweisungen anzuzeigen, was oft sehr nützlich ist.
Stephen Canon

48

Einstellen der folgenden Option:

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

Sie erhalten Ergebnisse, die wie folgt aussehen:

(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

Diese Option scheint in meiner Installation nicht vorhanden zu sein. Wurde es entfernt?
Fuz

2
@fuz Wahrscheinlicher, Ihre GDB ist alt
tbodt

@fuz mindestens in GDB 8.1 in Ubuntu 18.04 vorhanden.
Ciro Santilli 法轮功 冠状 病 六四 事件 19

sehr nützliche Fähigkeit
DaSqy Stc

1
show disassemble-next-line dient zum Testen, um den Flaggenstatus ein- oder auszuschalten
Sam

30

Wenn die nächsten Anweisungen beim Durchlaufen des Programms automatisch angezeigt werden sollen, können Sie den Befehl display wie folgt verwenden:

display /3i $pc

Oben werden 3 Anweisungen angezeigt, wenn ein Haltepunkt erreicht wird oder wenn Sie das Programm in einem Schritt ausführen.

Weitere Details im Blogeintrag hier .


23

Drücken Sie innerhalb von gdb Ctrl x 2und der Bildschirm wird in 3 Teile geteilt.

Der erste Teil zeigt Ihnen den normalen Code in Hochsprache.

Zweitens zeigt Ihnen die Baugruppe äquivalent und entsprechend instruction Pointer.

Drittens wird Ihnen die normale gdbAufforderung zur Eingabe von Befehlen angezeigt.

Siehe den Screenshot


Ich konnte es nicht starten Ctrl-X 2, aber es sieht aus wie ein gdb -tuiModus, der großartig ist.
Ciro Santilli 法轮功 冠状 病 六四 事件 9

7
Dies ist auch layout splitüber die gdb-Eingabeaufforderung erreichbar.
Chuckmash

22

GDB-Dashboard

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

Diese GDB-Konfiguration verwendet die offizielle GDB-Python-API, um uns zu zeigen, was wir wollen, wenn GDB beispielsweise danach stoppt next nach TUI , ähnlich wie bei TUI.

Ich habe jedoch festgestellt, dass diese Implementierung eine robustere und konfigurierbare Alternative zum integrierten GDB-TUI-Modus darstellt, wie unter: GDB- Split-Ansicht mit Code erläutert

Zum Beispiel können wir das GDB-Dashboard so konfigurieren, dass Disassemblierung, Quelle, Register und Stapel angezeigt werden mit:

dashboard -layout source assembly registers stack

So sieht es aus, wenn Sie stattdessen alle verfügbaren Ansichten aktivieren:

Geben Sie hier die Bildbeschreibung ein

Verwandte Fragen:


1
@downvoters: Bitte erklären Sie, damit ich Informationen lernen und verbessern kann. Ich glaube, dass dies eine überlegene Alternative für die derzeit akzeptierte TUI-Antwort ist: stackoverflow.com/a/2015523/895245
Ciro Santilli 1 冠状 病 六四 事件 1
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.