Najbardziej skomplikowane / przydatne polecenia dla debuggera gdb [zamknięte]

138

Czy możesz publikować najbardziej skomplikowane i przydatne polecenia podczas uruchamiania debugera, takiego jak gdb lub dbx.

Vijay
źródło
Uważam, że ta dokumentacja jest dobra. scc.ustc.edu.cn/zlsc/sugon/intel/debugger/cl/…
Rick

Odpowiedzi:

134
  1. backtrace full : pełne śledzenie wstecz za pomocą zmiennych lokalnych
  2. góra , dół , ramka : przechodzenie między ramkami
  3. watch : Zawieszenie procesu, gdy zostanie spełniony określony warunek
  4. set print pretty on : Drukuje ładnie sformatowany kod źródłowy C.
  5. ustaw logowanie : loguj sesję debugowania, aby pokazać innym osobom wsparcie
  6. ustaw print array on : Pretty array printing
  7. zakończenie : Kontynuuj do końca funkcji
  8. włączanie i wyłączanie : włączanie / wyłączanie punktów przerwania
  9. tbreak : Przerwij raz, a następnie usuń punkt przerwania
  10. gdzie : numer aktualnie wykonywanej linii
  11. informacje lokalne: Wyświetl wszystkie zmienne lokalne
  12. info args : Wyświetl wszystkie argumenty funkcji
  13. lista : wyświetl źródło
  14. rbreak : przerwa w funkcji pasującej do wyrażenia regularnego
Ramkumar Ramachandra
źródło
7
info locals- Zobacz wszystkie zmienne lokalne; lista - zobacz źródło; rbreak - przerwa w funkcji pasującej do wyrażenia regularnego.
Paul Biggar
source / path / to / macro / file I wszystkie moje fajne makra pomagają mi debugować w kilka sekund.
Sudhanshu
1
set print object ondla elementów polimorficznych i set print elements 0są to dwa polecenia, których używam bardzo często. Całkiem przydatne.
Kiril Kirov,
1
Również t a a bt(znaczenie thread apply all backtrace). Może być używany z (prawie) wszystkimi innymi poleceniami. Szczególnie przydatne w przypadku bt full.
Kiril Kirov
101

Uruchom gdb z tekstowym interfejsem użytkownika

gdb -tui
Amro
źródło
21
Nie mogę uwierzyć, że ta funkcja umknęła mi przez te wszystkie lata. Dziekuję Dziekuję Dziękuję!
DevSolar
Dzięki Zaoszczędziłeś mi dużo czasu… Cudowne…
sujin
1
I jeszcze: <minus> RET
SullX
1
lub użyj cgdb
Patryk
bardzo ładne funkcje. Do tej pory przegapiłem ...
PraveenMax
45

Począwszy od GDB 7.0, istnieje odwracalne debugowanie , więc Twoje nowe ulubione polecenia to:

* reverse-continue ('rc') -- Continue program being debugged but run it in reverse
* reverse-finish -- Execute backward until just before the selected stack frame is called
* reverse-next ('rn') -- Step program backward, proceeding through subroutine calls.
* reverse-nexti ('rni') -- Step backward one instruction, but proceed through called subroutines.
* reverse-step ('rs') -- Step program backward until it reaches the beginning of a previous source line
* reverse-stepi -- Step backward exactly one instruction
* set exec-direction (forward/reverse) -- Set direction of execution.
Paul Biggar
źródło
21

Zamiast uruchamiać GDB z parametrem „-tui”, możesz po chwili przełączyć się w tryb tekstowy, wpisując „wh”.

jaskółka oknówka
źródło
3
Ctrl-a a, aby powrócić do „normalnego” widoku wiersza poleceń!
Kevin,
2
„-” może być użyte zamiast „wh”. krócej tym lepiej .. :)
raj_gt1
6
Ctrl-a a? To żart? Wygląda bardziej jak tmux/ screencommand. I nie działa dla mnie. To musi być jeden , jak za docs : C-x C-a, C-x a, C-x A.
x-yuri
Właściwie to C-x a. Możesz także przełączać widoki za pomocą C-x 1i C-x 2w trybie tui, aby zobaczyć również montaż (w razie potrzeby).
Sam Whitlock,
16

thread apply all btlub thread apply all print $pc: Aby szybko dowiedzieć się, co robią wszystkie wątki.

Olof
źródło
To było polecenie, którego szukałem od dawna! To naprawdę paskudne sprawdzanie wszystkich 30 wątków jeden po drugim!
tothphu
6

Na przykład makra zdefiniowane w stl-views.gdb

grigy
źródło
6

Korzystanie z -command=<file with gdb commands>opcji podczas odpalania gdb. Tak samo jak -x <command file>. Ten plik poleceń może zawierać polecenia gdb, takie jak punkty przerwania, opcje itp. Przydatne w przypadku, gdy określony plik wykonywalny musi zostać poddany kolejnym uruchomieniom debugowania przy użyciu gdb.

raghava
źródło
Możesz także użyć -iexopcji dodawania poszczególnych poleceń w wierszu poleceń gdb.
doug65536
5

skrypty gdb to dobra sztuczka, poza tym lubię włączać / wyłączać blokowanie harmonogramu, aby zapobiec uruchamianiu innych wątków, gdy wchodzisz w jeden.

Ben
źródło
1
Jak ustawić blokowanie harmonogramu?
deft_code
3
set scheduler-locking oninside gdb
Ben
jak ustawić to jako domyślne? Próbowałem .gdbinit, ale gdb drukuje /home/omry/.gdbinit:1: Błąd w źródłowym pliku poleceń: Cel „Brak” nie obsługuje tego polecenia.
Omry Yadan
4
  • Za pomocą .gdbinit (plik startowy, w którym możesz pisać makra i wywoływać z gdb). Umieść plik .gdbinit w swoim katalogu domowym, aby był pobierany za każdym razem, gdy ładowany jest plik gdb
  • info wątki, aby wyświetlić wszystkie aktywne wątki, if (#) -> # numer wątku, do którego chcesz się przełączyć

  • czasami używam gdb do konwersji z szesnastkowego na dziesiętny lub binarny, jest to bardzo przydatne zamiast otwierania kalkulatora

    • p / d 0x10 -> daje dziesiętny odpowiednik 0x10
    • p / t 0x10 -> binarny odpowiednik 0x10
    • p / x 256 -> szesnastkowy odpowiednik 256
subbul
źródło
4

Zamiast uruchamiać gdb z opcją -tui, aby zobaczyć proces potomny, który zawiera ekran, który podkreśla, gdzie wykonywana linia kodu znajduje się w twoim programie, wskakuj i wychodź z tej funkcji za pomocą Cx o i Cx a. Jest to przydatne, jeśli używasz tej funkcji i tymczasowo jej nie używać, aby można było użyć strzałki w górę, aby uzyskać poprzednie polecenie.

Rose Perrone
źródło
2
możesz zmienić fokus na okno poleceń za pomocą, focus cmdaby działały strzałki w górę / w dół. Przełączasz się z powrotem za pomocą focus src.
Nathan Fellman,
3

Może to być przydatne, ale jestem pewien, że można to poprawić, pomóżcie powitać:

define mallocinfo
  set $__f = fopen("/dev/tty", "w")
  call malloc_info(0, $__f)
  call fclose($__f)
elmarco
źródło