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


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)

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.


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.


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

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 .


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


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:


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 法轮功 冠状 病 六四 事件 法轮功
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.