Jak podświetlić i pokolorować wyjście GDB podczas debugowania interaktywnego?

172

Proszę nie odpowiadać. Powinienem używać ddd, nemiver, emacs, vim lub jakiegokolwiek innego interfejsu, po prostu wolę gdb w takiej postaci, w jakiej jest, ale chciałbym zobaczyć jego wyjście z niektórymi kolorami terminala.

elmarco
źródło
4
Nie da ci kolorów (więc nie będę nazywać tego odpowiedzią), ale pewna konfiguracja ~ / .gdbinit poprawi wrażenia. Używam tego jako absolutnego minimum: ustaw historię zapisuj na zestawie drukuj ładnie ustaw wartość wyjściową-radix 16 ustaw wysokość 0
activout.se
Byłoby miło zmienić zaakceptowaną odpowiedź, aby moja stara, błędna odpowiedź mogła zostać usunięta. Dzięki.
ddaa
Po podświetleniu bieżącej linii na lzostanie zaimplementowana sourceware.org/bugzilla/show_bug.cgi?id=21044 , po prostu dodam ldo a hook-stopi wprowadzę Dev Nirvana.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

183

.gdbinit

Możesz dostosować swoje, ~/.gdbinitaby mieć kolory. Możesz skorzystać z mamonów, .gdbinitktóre są dostępne tutaj:

https://github.com/gdbinit/gdbinit

Możesz go modyfikować tak bardzo, jak chcesz. Znalazłem to dzięki tej odpowiedzi TAK . Oto rodzaj wyników, które można uzyskać:

.gdbinit

Dostępne jest również repozytorium GitHub: https://github.com/gdbinit/Gdbinit

Na marginesie, ten sam pomysł też Nawiasem mówiąc zastosowany do lldb .

Pulpit nawigacyjny GDB

Zgodnie z tą samą koncepcją, GDB Dashboard zapewnia modułowy interfejs wizualny dla GDB w Pythonie.

Pulpit nawigacyjny GDB

(nieważne) walker

Inny podobny projekt wykorzystuje obsługę Pythona GDB, aby zapewnić większą rozszerzalność, więc warto to sprawdzić: https://github.com/dholm/voidwalker

@dholm zapewnia również własny plik .gdbinit inspirowany poprzednim.

(nieważne) walker

pwndbg

Niektóre projekty zapewniają zestaw przydatnych funkcji, w tym ulepszony wyświetlacz. Tak jest w przypadku PEDA lub pwndbg . Ten ostatni podaje następujący opis:

Wymiana PEDA. W duchu naszego dobrego znajomego windbg, pwndbgjest wymawiane pwnd-bag.

  • Prędkość
  • Odporność
  • Czysty kod

Zapewnia polecenia do obsługi debugowania i wykorzystywania programów podobnych do tych z PEDA oraz lepsze wyświetlanie (chociaż nie jest to głównym celem projektu). Oprogramowanie jest nadal w fazie rozwoju i nie zostało jeszcze poprawnie wydane.

pwndbg

voltron

W projekcie opis stanowi:

Voltron to rozszerzalny interfejs debugera dla hakerów. Umożliwia dołączanie widoków narzędzi działających w innych terminalach do debuggera (LLDB lub GDB), wyświetlając przydatne informacje, takie jak demontaż, zawartość stosu, wartości rejestrów itp., Jednocześnie zapewniając ten sam debugger CLI, do którego jesteś przyzwyczajony.

Możesz zmodyfikować swój, .gdbinitaby automatycznie go zintegrować. Jednak sam wyświetlacz znajduje się poza GDB (np. W podziale tmux).

voltron

GEF

GEF to kolejna opcja, opisana jako:

Jest przeznaczony głównie do wykorzystania przez eksploatatorów i inżynierów odwrotnych, aby zapewnić dodatkowe funkcje GDB za pomocą interfejsu API Pythona, aby pomóc w procesie analizy dynamicznej i rozwoju exploitów.

GEF

BenC
źródło
wielkie dzięki za odpowiedź, czy masz pomysł jak wyłączyć wyjście rejestru? (Używam gdb dla kodu C ++ i nie potrzebuję od razu poziomu asemblera)
vak
tak. Cholera „Komentarze muszą mieć co najmniej 15 znaków”.
vak
1
@vak próbowałeś set $SHOWCPUREGISTERS = 0? Zasadniczo masz kilka parametrów, które możesz ustawić i zawsze możesz zmodyfikować kod, aby dopasować go do swoich potrzeb.
BenC
100

To nie są kolory, ale weź pod uwagę tekst GUI gdb . To robi ogromną różnicę w tym, jak użyteczna jest gdb.

Możesz go uruchomić za pomocą:

gdb -tui executable.out

Zrzut ekranu:

wprowadź opis obrazu tutaj

Jak widać, główne cechy to:

  • pokazuje, na której linii źródła się znajdujemy i linie otaczające
  • pokazuje punkty przerwania
John Carter
źródło
5
Łał! Dzięki! Przez długi czas szukałem ładnej powłoki graficznej wokół gdb i próbowałem xxgdb, kgdb i ddd, ale żaden z nich nie działał zbyt dobrze dla mnie, więc utknąłem przy zwykłym starym interfejsie wiersza poleceń. Ale to jest absolutnie doskonałe!
Thomas Padron-McCarthy
46
Ctrl-x Ctrl-a: Wprowadź to, aby przełączyć się do iz trybu GUI tekstu, działa nawet bez opcji wiersza poleceń.
jturcotte
2
Drukowanie na stdout z programu psuje mi interfejs. Czy są jakieś obejścia poza przekierowaniem?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Otrzymuję ten sam problem z uszkodzeniem interfejsu przez standardowe wyjście. Ctrl-L lub cokolwiek innego, co jest związane z przerysowaniem, czyni go użytecznym przynajmniej. Dla osób z włączonym trybem edycji vi, Ctrl-X Ctrl-A nie działa, ale polecenie „layout src” przełączy cię w tryb TUI ze źródłem pokazanym jak na obrazku.
wilywampa
1
Otwórz drugi terminal, a następnie wydaj polecenie: $ tty Użyj wyniku, aby skierować wyjście standardowe z sesji gdb do tego terminala za pomocą polecenia (gdb) set inferior-tty. dawny. z mojego zestawu .gdbinit inferior-tty / dev / tty2 teraz twoje standardowe wyjście nie zepsuje $ gdb -tui.
netskink
46

Wiem, że nie chciałeś frontendu. Ale co z cgdb , jest bardzo zbliżony do gdb, jest w trybie tekstowym, ale ma okno źródłowe powyżej z podświetleniem składni w kodzie.

Johan
źródło
2
sudo apt-get install cgdb
cs01
2
Prawdziwy przypadek :)
Ignorant
Właśnie próbowałem go uruchomić: nie widzi żadnej historii GDB, a także ma schrzaniony znak zachęty, w którym między daszkiem a rzeczywistym miejscem wpisywania symbolu jest jakiś biały znak (prawdopodobnie dlatego, że mam kolorowy znak zachęty gdb ) . Nie jestem pod wrażeniem.
Hi-Angel,
19

Dzięki zastosowaniu kolorów możliwe jest znaczne uwydatnienie wyglądu gdb. Odbywa się to za pomocą jednej z następujących metod:

  1. Kolorowa podpowiedź poprzez „ustaw znak zachęty”. Np. Zaznacz monit pogrubiony i czerwony:

    set prompt \033[1;31m(gdb) \033[m

    lub nadaj podpowiedź nowy kształt, pogrubiony i czerwony:

    set prompt \033[01;31m\n\n#####################################> \033[0m

    wprowadź opis obrazu tutaj

  2. Kolorowe polecenia za pomocą haczyków

  3. Podświetlanie składni kolorem w poleceniu „lista”.

Wszystkie przykłady są dostępne w następujących postach na blogu napisanych przez Michaela Kellehera:

„Beautify GDB”, 12 maja 2010 (przez archive.org)

„Eksperymentalne podświetlanie składni GDB”, 15 maja 2010 (za pośrednictwem archive.org)

Mikrofon
źródło
14
Linki są zepsute.
John Carter,
7
@Mike: warto zamieścić tutaj zawartość tych linków, ponieważ witryna nie jest już dostępna, a plik robots.txt uniemożliwił jej zindeksowanie na stronie archive.org.
Lucian Adrian Grijincu
1
Odpowiednie informacje można znaleźć tutaj: sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil
1
Linki są teraz wskazywane na pamięć podręczną archive.org z postami na blogu.
Alex Quinn
1
@Mike, wygląda na to, że jesteś autorem postów na blogu; jeśli tak, powinieneś to ujawnić w odpowiedzi.
David Z
13

Nowość w nadchodzącym GDB 8.3!

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/NEWS

Stylizacja terminala jest teraz dostępna dla CLI i TUI. Podświetlanie źródła GNU może być dodatkowo używane do zapewniania stylizacji fragmentów kodu źródłowego. Aby uzyskać więcej informacji, zobacz poniżej polecenia „ustawianie stylu”.

zrzut ekranu z gdb 8.2.91.20190401-23.fc30

elmarco
źródło
Najlepsza odpowiedź NIGDY! Możesz znaleźć tutaj poradnik jak zainstalować gdb 8.3 medium.com/@simonconnah/ ... , pamiętaj, że twój komputer potrzebuje co najmniej 512 MB pamięci RAM, w przeciwnym razie gcckompilator rozpocznie koszowanie.
użytkownik
7
#into .gdbinit
shell mkfifo /tmp/colorPipe

define hook-disassemble
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=asm -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-disassemble
hookpost-list
end 

define hook-list
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=cpp -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-list
set logging off 
set logging redirect off 
shell sleep 0.1s
end 

define hook-quit
shell rm /tmp/colorPipe
end 

define re
hookpost-disassemble
echo \033[0m
end 
document re
Restore colorscheme
end 

Ostrzeżenie: Buggy. Brak obsługi TUI, hackowanie w trybie użytkownika.

Znalazłem tutaj główną część i trochę ją zmodyfikowałem. Wymaga podświetlenia, c ++ filt. Jeśli kolory się pomieszają, wydaj ponownie polecenie.

ftk
źródło
7

cgdb jest znacznie lepszy niż gdb -tui

justin.yqyang
źródło
Zgoda. Proste linie wydrukowane przez mój program zniszczyły konsolę gdb -tui. Nie dzieje się tak w przypadku cgdb. Dzięki za wskazówkę!
Randall Cook
4

Chciałem wyróżnić w następujący sposób: podkreślić wiersze śladu stosu, które należą do moich plików źródłowych (a nie do bibliotek).

Rozwiązaniem było użycie gdb-python (na MSYS; w Linuksie zazwyczaj gdbjest już wbudowany Python?), Podpięcie backtrace, użycie

python stack_trace = gdb.execute('backtrace', False, True')

Następnie przetwórz stack_tracez wyrażeniami regularnymi Pythona i wydrukuj je. Pogrubienie i inne kolory uzyskuje się za pomocą takiej funkcji:

def term_style(*v):
    """1 is bold, 30--37 are the 8 colours, but specifying bold may also
    change the colour. 40--47 are background colours."""
    return '\x1B['+';'.join(map(str, v))+'m'

#Use like this:
print term_style(1) + 'This will be bold' + term_style(0) #Reset.
print term_style(1,30) + 'This will be bold and coloured' + term_style(0)
print term_style(1,30,40) + 'Plus coloured background' + term_style(0)
Evgeni Sergeev
źródło
Działający przykład wykorzystujący haczyk - nawet minimalny - byłby prawdopodobnie bardziej pożądany.
Hi-Angel,
4

Taka konfiguracja daje kolejną dobrą kombinację kolorów . Znacznie ułatwia sprawdzanie śladów wstecznych. Aby z niego skorzystać, po prostu zapisz ten plik jako ~/.gdbiniti uruchom gdb normalnie

Andrea Araldo
źródło
Dzięki, właśnie tego szukałem. Szukałem aplikacji wielowątkowej z długim stosem wywołań i jest to idealne rozwiązanie dla tych śladów śledzenia.
Johan Bjäreholt
-2

możesz uzyskać dowolne kolory;

# gdb
(gdb) shell echo -en '\E[47;34m'"\033[1m"
...
anything is now blue foreground and white background
...
(gdb) shell tput sgr0
... back to normal
RandomNickName42
źródło