2009-04-02 14 views
10

Jestem w systemie Windows, uruchamiając GDB na plik wykonywalny zbudowany pod MinGW. Program ma nieskończoną pętlę. Chcę go znaleźć, naciskając Ctrl-C. Kiedy to zrobię, zarówno program, jak i GDB wyjdą. Cała pomoc na ten temat wydaje się zakładać, że jestem na Linuksie.W GDB na MinGW, jak zrobić Ctrl-C zatrzymać program?

Odpowiedz

6

Dzieje się tak, ponieważ gdb nie obsługuje poprawnie zdarzenia ctrl-c programu GUI (nie konsolowego). Możesz znaleźć obejście tutaj http://www.mingw.org/wiki/Workaround_for_GDB_Ctrl_C_Interrupt

+0

Hej, dzięki. Dam ci spróbować! –

+1

Szkoda, że ​​można użyć obejścia tylko do debugowania programu Windows. Jeśli chodzi o mnie, to debuguję program na Androida :( – Qwertie

0

Aby znaleźć nieskończoną pętlę, możesz spróbować przejść przez wykonanie, aż dojdziesz do sekwencji, która powtarza się w nieskończoność.

Nie jestem pewien, ale myślę, Ctrl-C powinny jedynie powstrzymać egzekucję, nie gdb się ...

myślę, że jest to „obsłużyć” polecenia, które można wykorzystać do kontrolowania sposobu przerwania sygnał jest obsługiwany.

+0

Wiem. Miałem nadzieję, że nie będę musiał tego robić. –

+0

Masz rację w obu przypadkach, ale wydaje się, że nie działa w systemie Windows DOS-box. –

3

Którą "powłokę" używasz? Jeśli używasz powłoki "rxvt" MSYS, zachowanie jest prawie takie, jak opisujesz. Ctrl-C działa tylko wtedy, gdy używasz zwykłego wiersza poleceń systemu Windows.

+0

To przydatne informacje. Jestem w wierszu poleceń systemu Windows i nie działało, ale spróbuję jeszcze raz. –

+0

Możesz również wypróbować "Console2". Powinno to zachowywać się blisko wiersza polecenia systemu Windows, ale jest o wiele ładniejsze. Używam gdb cały czas z tym i nigdy nie mam żadnych problemów. https://sourceforge.net/projects/console/ –

2

Właśnie trafiłem ten sam problem.

Obejście tego wiki polega na uruchomieniu debugbreak z pid debugowanego procesu, ale ps nie pokazuje tego pid, tylko pid z gdb. Może jest inny sposób na uzyskanie tego.

Ale jest prostsze obejście tego problemu. Po prostu uruchom program normalnie (nie w gdb), sprawdź pid od ps i uruchom gdb z tym pid jako drugim argumentem. Po podłączeniu gdb proces zatrzymuje się i mogę wydrukować ślad.

+1

Dzięki. Jakiś czas temu uderzyłem w to: Hit^C i debugger zatrzymał się, ale zatrzymał się w innym wątku niż główny program. , informuje numer wątku programu głównego.Następnie przełączam się na ten wątek i mogę zrobić 'bt', aby pokazać stos. Przypuszczam, że jest to całkowicie oczywiste dla każdego, kto naprawdę zna GDB. –

0

Oto rozwiązanie, które działa za każdym razem:

Kiedy GDB zaczyna używać tego wyrażenia regularnego, aby uchwycić gorszy identyfikator procesu:

"\[New Thread (\d+)\." 

Następnie użyj:

hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, PID); 
DebugBreakProcess(hProcess); 
CloseHandle(hProcess); 

Mieć spójrz na poniższy skrypt inicjowania GDB, jest on wymagany do pracy z MinGW w systemie Windows 7 i nowszych:

# ===================================== 
# GDB preload initialization commands 
# ===================================== 

# Set Unicode Charset 
#set target-charset UCS-2 
#set host-charset UCS-2 
#set charset UCS-2 
#set target-wide-charset UCS-2 

# Set UTF-8 Charset 
set target-charset UTF-8 
set host-charset UTF-8 
set charset UTF-8 
set target-wide-charset UTF-8 

# Request async target mode 
set target-async 1 

# Do not complain about pending breakpoints 
set breakpoint pending on 

# Enable All-Stop for all Threads 
set non-stop off 

# Do not ask for confirmations 
set confirm off 

# Do not create new console for output/logging 
set new-console off 

# Turn-off paggination to allow integration with IDE 
set pagination off 

# Call Stack files (and anywhere else) should be absolute path 
set filename-display absolute 

# Enable Pretty Print in GDB Panel 
set print pretty on 

# Enable notification of completion for asynchronous execution commands. 
set exec-done-display on 

# Show Addresses in objects, required for integration with IDE 
set print address on 

# Enable Pretty Print for Arrays 
set print array on 

# Flatten objects, required for integration with IDE 
set print object off 

# Include static members, required for integration with IDE 
set print static-members on 

# Show demangled vtable, required for integration with IDE 
set print vtbl off 
set print demangle on 
set demangle-style gnu-v3 

# Print full eight-bit characters, required for integration with IDE 
set print sevenbit-strings off 

# Set path for obj files 
path $(TARGET_ROOT)/obj 

# Load gdb scripts for STL (string, vector, map, etc.) 
source $(PATH_SDK_DEBUGGER)/stl-views-1.0.3.gdb 

# List of source code files 
dir $(PATH_SDK_COMMON) 
dir $(PATH_SDK_FRAMEWORKS) 
dir $(PATH_SDK_INCLUDES) 
dir $(PROJECT_PATHS.NATIVE_COMMON) 

# Load the binary 
file $(TARGET_OUTPUT) 
0

Jak zauważył Matthew Talbert, dzieje się tak, gdy GDB zbudowany z natywnym narzędziem MinGW jest używany wewnątrz MSYS/Cygwin. Uruchamianie gdb z winpty działało jak czar, ponieważ jest to narzędzie przeznaczone właśnie do tego. Pracował również dla cdb.exe