2012-06-29 20 views
10

Używałem normalnie gdb dla 1 lub 2 projektów. To znaczy. Wzywam gdb --args prog args. gdb działa w tym samym tty co program, który debuguję.poczekaj na dołączenie gdb

Jednak mój najnowszy projekt modyfikuje narzędzie dtach. Jest to ekran podobny do programu, więc tty są przekierowywane gdzie indziej, dlatego muszę użyć funkcji dołączania gdb.

Problem z GDB Attack polega na tym, że nie możesz dołączyć od samego początku, ponieważ musisz najpierw uruchomić program, aby uzyskać pid do którego chcesz dołączyć.

Czy jest jakiś sposób, aby uzyskać program oczekiwania w punkcie do czasu dołączenia gdb?

Nie mogę używać gdbserver, ponieważ jestem na cygwin. Próbowałem też używać pause(), ale to się zawiesiło, kiedy próbowałem kontynuować.

+0

Mój zły komunikat na liście mailingowej narzekają, że gdbserver nie działa na Cygwin było od 9 lat temu. Przygotowałem go ostatniej nocy i działa dobrze. Z jakiegoś powodu plik binarny gdbserver nie znajduje się w repozytorium cygwin, prawdopodobnie ze względu na wąskie przypadki użycia dla cygwin. Istnieje również potencjalny sposób dołączenia gdb do programu od początku za pomocą kodu debugowania gdb. Dzięki za odpowiedzi. – rhlee

Odpowiedz

1

Niektóre platformy mogą wymagać instrukcji lub pułapek związanych z oczekiwaniem na debugowanie.

W bardziej przenośny sposób można sprawić, że program zaczeka na spełnienie warunków zewnętrznych, takich jak połączenie z gniazdem lub zapisanie niektórych danych w fifo. Następnie można nawiązać połączenie lub wysyłać fałszywe dane z trzeciego terminala.

Lub możesz umieścić nieskończoną pętlę w programie, testując wartość pewnej zmiennej lotnej, którą modyfikujesz za pomocą debuggera, aby umożliwić jej kontynuację.

Jeśli przypominam, możesz użyć windows apis w programach cygwin, a niektóre wyszukiwania internetowe wskazują, że jeden z nich może wykryć, czy program jest debugowany, więc możesz być w stanie zapętlić pętlę, dopóki nie wróci.

12

Oto jak rozwiązuję ten problem. Widziałem też, jak inni ludzie również robią tę sztuczkę.

Wybierz miejsce, w którym chcesz zatrzymać program i poczekaj na dołączenie debuggera. W przypadku większości programów będzie to dopiero początek, ale jeśli jest coś do zrobienia, możesz to zakończyć, a potem to zrobić.

umieszczone w pętli podobny do tego:

#ifdef DEBUG 

int i = 0; 

while (i == 0) 
{ 
    usleep(100000); // sleep for 0.1 seconds 
} 

#endif // DEBUG 

Po pomyślnym dołączone do procesu, można użyć debuggera aby zmienić wartość zmiennej i, który złamie pętlę i umożliwić normalne wykonanie, aby kontynuować.

Komenda gdb zmienić zmienną na 1: set var i = 1

Inną rzeczą, którą robię cały czas: zdefiniować krótko funkcję o nazwie nop(), że nic nie robi („NIE działanie”). Potem mam połączenie z numerem nop() gdziekolwiek chcę się zepsuć i umieścić punkt przerwania wewnątrz nop().

Uwaga: jeśli kompilujesz kompilacje debugowania przy pomocy -O0, kompilator nie zoptymalizuje zmiennej. Jeśli potrzebujesz tej sztuczki do pracy ze zoptymalizowaną kompilacją, prawdopodobnie musisz zadeklarować zmienną jako volatile.

+0

Musi być rozwiązanie, w którym zainstalujesz procedurę obsługi sygnału, która ustawi zmienną 'i' w celu przerwania pętli? – To1ne

9

Przynajmniej z LLDB, aby proces wysłał SIGSTOP do siebie, powinien załatwić sprawę. Polecenie Kontynuuj debugowanie wyda następnie SIGCONT. Powinno to również działać z GDB. Ewentualnie spróbuj SIGINT zamiast SIGSTOP.

Dołącz header

#include <signal.h> 
#include <csignal> // or C++ style alternative 

następnie

raise(SIGSTOP) 
+0

Komenda gdb 'sygnały informacyjne' wypisuje listę sygnałów i czy są one przekazywane do programu. Następnie możesz zmodyfikować jego zachowanie za pomocą komendy 'handle'. –

Powiązane problemy