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
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
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.
Wiem. Miałem nadzieję, że nie będę musiał tego robić. –
Masz rację w obu przypadkach, ale wydaje się, że nie działa w systemie Windows DOS-box. –
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.
To przydatne informacje. Jestem w wierszu poleceń systemu Windows i nie działało, ale spróbuję jeszcze raz. –
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/ –
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.
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. –
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)
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
Hej, dzięki. Dam ci spróbować! –
Szkoda, że można użyć obejścia tylko do debugowania programu Windows. Jeśli chodzi o mnie, to debuguję program na Androida :( – Qwertie