Я нахожусь в Windows, запустив GDB на исполняемый файл, созданный под MinGW. Программа имеет бесконечный цикл. Я хочу найти его, нажав Ctrl-C. Когда я это сделаю, и программа, и выход GDB. Вся помощь по этому вопросу, похоже, предполагает, что я нахожусь в Linux.
В GDB на MinGW, как заставить Ctrl-C остановить программу?
Ответ 1
Это связано с тем, что gdb не обрабатывает ctrl-c событие GUI (не консольной) программы. Вы можете найти обходное решение здесь http://www.mingw.org/wiki/Workaround_for_GDB_Ctrl_C_Interrupt
Ответ 2
Какую "оболочку" вы используете? Если вы используете оболочку MSYS "rxvt", поведение в значительной степени зависит от вашего описания. Ctrl-C работает только в том случае, если вы используете обычную командную строку Windows.
Ответ 3
Я только что попал в ту же проблему.
Обходной путь из wiki заключается в том, чтобы запустить debugbreak
с pid отлаживаемого процесса, но ps
не показывает этот pid, только pid из gdb. Возможно, есть другой способ его получить.
Но есть более простое обходное решение. Просто запустите программу обычно (не в gdb), проверьте pid из ps
и запустите gdb с этим pid в качестве второго аргумента.
Когда gdb подключен, процесс останавливается, и я могу распечатать обратную сторону.
Ответ 4
Чтобы найти бесконечный цикл, вы можете попробовать выполнить операцию до тех пор, пока не получите последовательность, которая будет повторяться бесконечно.
Я не уверен, но я думаю, что Ctrl-C должен только остановить выполнение, а не сам gdb...
Я думаю, что есть команда "handle", которую вы можете использовать для управления обработкой сигнала прерывания.
Ответ 5
Вот решение, которое работает каждый раз:
Когда GDB начинает использовать это регулярное выражение для захвата нижнего идентификатора процесса:
"\[New Thread (\d+)\."
Затем используйте:
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);
DebugBreakProcess(hProcess);
CloseHandle(hProcess);
Посмотрите на следующую инициализацию GDB script, для этого необходимо, чтобы это работало с MinGW в Windows 7 и более поздней версии:
# =====================================
# 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)
Ответ 6
Как сказал Мэтью Талберт, это происходит, когда GDB, построенный с использованием встроенной инструментальной комбинации MinGW, используется внутри MSYS/Cygwin. Запуск gdb с winpty работал как шарм, поскольку он предназначен для этого. Также работал для cdb.exe