Pokaż aktualną instrukcję montażu w GDB

179

Debuguję na poziomie asemblera w GDB. Czy istnieje sposób, aby GDB pokazał mi bieżącą instrukcję montażu w taki sam sposób, jak pokazuje bieżącą linię źródłową? Domyślne wyjście po każdym poleceniu wygląda następująco:

0x0001433f      990         Foo::bar(p);

Daje mi to adres bieżącej instrukcji, ale muszę ciągle odwoływać się do wyjścia disassemble, aby zobaczyć, która instrukcja aktualnie wykonuję.

JSB ձոգչ
źródło

Odpowiedzi:

314

Możesz przełączyć się na układ zespołu w GDB:

(gdb) layout asm

Zobacz tutaj, aby uzyskać więcej informacji. Bieżąca instrukcja montażu zostanie pokazana w oknie asemblera.

   ┌───────────────────────────────────────────────────────────────────────────┐
   │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)
ks1322
źródło
1
@greatwolf, wygląda na to, że nie masz obsługi tui w swoim gdb. Aby uzyskać więcej informacji, zobacz to pytanie: stackoverflow.com/q/6706838/72178 .
ks1322
9
Schludny! Czy mogę teraz mieć podobne okno dla rejestrów? Rzeczywiście mogę:layout regs
Jens
Zobacz także dokumentację gdb dla innych poleceń TUI , takich jak tui reg vectorpokazywanie wektorowych rejestrów zamiast liczb całkowitych. (Nie zawsze jednak bardzo użyteczne, ponieważ nie pozwala wybrać tylko tego .v8_int16czy czegoś, więc wyświetlanie jest dużym bałaganem). Zobacz wiki tagu x86, aby uzyskać szybki samouczek na temat debugowania asm.
Peter Cordes,
Chodzi o bezużyteczną funkcję i wyjście. Zmienione nazwy C ++ są za długie, a wszystko, co próbuję wyświetlić, znajduje się poza ekranem po prawej stronie. Co za głupia decyzja (domyślnie nie wyświetlać ASM si), a co bezużyteczna funkcja (rzutnia, która nie wyświetla niezbędnych informacji). Nie ma sensu głosować w dół na tę odpowiedź, ponieważ jesteś tylko posłańcem ...
jww
1
podobnie, ·layout srcaby zobaczyć kod źródłowy podczas debugowania, a także warto pamiętać o wyjściu z tego trybu przezCTRL+x+a
Baiyan Huang
149

Możesz to zrobić

display/i $pc

i za każdym razem, gdy GDB zatrzyma się, wyświetli demontaż następnej instrukcji.

GDB-7.0obsługuje również set disassemble-next-line on, które zdemontują całą następną linię i dadzą więcej kontekstu dezasemblacji.

Zatrudniony rosyjski
źródło
1
Jak włączyć tę funkcję, gdy korzystamy si(ale nie używamy s)?
jww
54

Komenda

x/i $pc

można ustawić na ciągłe działanie przy użyciu zwykłego mechanizmu konfiguracji.

bmargulies
źródło
29
I x/ni $pcprzeglądanie kolejnych n instrukcji, co jest często bardzo przydatne.
Stephen Canon
48

Ustawienie następującej opcji:

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

Daje wyniki, które wyglądają tak:

(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
Bob Ensink
źródło
Ta opcja nie istnieje w mojej instalacji. Czy został usunięty?
fuz
2
@fuz Najprawdopodobniej twój gdb jest stary
tbodt
@fuz obecny przynajmniej w GDB 8.1 w Ubuntu 18.04.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
bardzo przydatna umiejętność
DaSqy Stc
1
pokaż demontaż-następny wiersz jest do testu, aby wydrukować status flagi, włączony lub wyłączony
Sam
30

Jeśli chcesz, aby kilka kolejnych instrukcji wyświetlało się automatycznie podczas przechodzenia przez program, możesz użyć polecenia display w następujący sposób -

display /3i $pc

Powyższe wyświetli 3 instrukcje za każdym razem, gdy zostanie osiągnięty punkt przerwania lub gdy wykonasz pojedynczy krok programu.

Więcej informacji na blogu tutaj .

mohit
źródło
23

Z poziomu gdb naciśnij, Ctrl x 2a ekran zostanie podzielony na 3 części.

Pierwsza część pokazuje normalny kod w języku wysokiego poziomu.

Drugi pokaże ekwiwalent zespołu i odpowiadające instruction Pointer.

Trzeci przedstawi normalny gdbmonit o wpisywanie poleceń.

Zobacz zrzut ekranu

abhi
źródło
Nie mogłem go uruchomić Ctrl-X 2, ale wygląda jak gdb -tuitryb, który jest świetny.
Ciro Santilli 9 冠状 病 六四 事件 法轮功
7
Można to również uzyskać za layout splitpomocą polecenia gdb.
chucksmash
22

Pulpit nawigacyjny GDB

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

Ta konfiguracja GDB korzysta z oficjalnego API GDB Python, aby pokazać nam, co chcemy, gdy GDB zatrzymuje się na przykład next, podobnie jak TUI.

Odkryłem jednak, że ta implementacja jest bardziej niezawodną i konfigurowalną alternatywą dla wbudowanego trybu GDB TUI, jak wyjaśniono na: podzielonym widoku gdb z kodem

Na przykład możemy skonfigurować GDB Dashboard, aby wyświetlał demontaż, źródło, rejestry i stos z:

dashboard -layout source assembly registers stack

Oto jak to wygląda, jeśli zamiast tego włączysz wszystkie dostępne widoki:

wprowadź opis zdjęcia tutaj

Powiązane pytania:

Ciro Santilli
źródło
1
@ downvoters: proszę wyjaśnij, abym mógł nauczyć się i poprawić informacje. Uważam, że jest to lepsza alternatywa dla obecnie akceptowanej odpowiedzi TUI: stackoverflow.com/a/2015523/895245
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功