22 lipca 2015

[gdb] - pomocne instrukcje

Współpraca z gdb zaczyna się rozwijać, więc mała notka z najbardziej przydatnymi komendami, ale najpierw przydatne linki:
Te klika komend warto wpisać na stałe do pliku konfiguracyjnego ~/.gdbinit.
# zastąpienie domyślnego assemblera att, na wersję intel-owsą
set disassembly-flavor intel

# zapisywanie historii poleceń do pliku
set history filename ~/.gdb_history
set history save on
set history size 100000

# TUI - text user interface (po wywołaniu layout)
set tui border-kind ascii
set tui border-mode half
set tui active-border-mode bold
Komendy TUI, które pozwalają zorientować się co tak naprawdę dzieje się z programem:
  • layout - wyświetla pseudo okno, w którym może być prezentowany kod assemblera, rejestry lub kod źródłowy. Przykładowe wywołania: layout asm, layout src, layout reg
  • info win - informacja o wyświetlanych oknach
  • focus - przełączanie focusu na różne okna, przydatne przy pracy z myszką, przykład: focus cmd
  • refresh - odświeża wszystkie okna, sam nie wiem czemu, ale ich wygląd często się psuje. Wygodniejszą metodą służącą odświeżaniu jest zastosowanie skrótu klawiaturowego, ale o tym poniżej
Przydatne skróty klawiaturowe w pracy z TUI.
  • Wyłączanie TUI, można zastosować jeden z poniższych skrótów:
    • Ctrl+x Ctrl+a
    • Ctrl+x a
  • Odświeżanie okien - odpowiednik komendy refresh:
    • Ctrl+x+l
  • Włączanie layoutu
    • Ctrl+x 1 - jedno okno
    • Ctrl+x 2 - dwa okno

  • Szybkie odwołanie się do komend z historii, bez potrzeby fokusownia okna cmd i używania strzałek
    • Ctrl+p/Ctrp+w - góra/dół

Operowanie z kodem, to przede wszystkim prezentacja wycinków pamięci w jakimś przyjaznym formacie:
  • display - wyświetla zmienną/rejestr, przy każdym zatrzymaniu programu, np. display $eax
  • x - wyświetlanie zwartości pamięci, format wywołania wygląda następująco
    x/[rozmiar][format][rozmiar pola] [adres]
    , gdzie:
    • Rozmiar - ilość bajtów jakie będą wyświetlone
    • Format:
      • d - dec
      • x - hex
      • z - jakeiś inne hex?
      • u - unsigned dec
      • f - float
      • c - char (ASCII)
      • a - adres
      • i - instrukcja
      • s - string
    • Rozmiar pola:
      • b - byte (8 bitów)
      • h - halfword (16 bitów)
      • w - word (32 bity)
      • g - giant (64 bity)
Przykład użycia x:
(gdb) x/12xb 0x8048af4
0x8048af4 <_ZN8MyClass1C2Ev>:    0x55  0x89  0xe5  0x83  0xec  0x08  0x8b  0x45
0x8048afc <_ZN8MyClass1C2Ev+8>:  0x08  0x83  0xec  0x0c
Debugowani kodu assemblera trochę różni się trochę od sytuacji, gdy działamy tylko z kodem źródłowym. W takim wypadku zamiast wyniku działania jednej linii kodu, interesuje nas bardziej jaki jest wynik działania jednej instrukcji kodu:
  • si - wykonuje pojedynczą instrukcję

Brak komentarzy:

Prześlij komentarz