В GDB на MinGW, как заставить Ctrl-C остановить программу? - PullRequest
11 голосов
/ 02 апреля 2009

Я на Windows, запускаю GDB на исполняемый файл, созданный под MinGW. Программа имеет бесконечный цикл. Я хочу найти его, нажав Ctrl + C . Когда я это сделаю, программа и GDB завершатся. Кажется, вся помощь по этому вопросу предполагает, что я нахожусь в Linux.

Ответы [ 6 ]

7 голосов
/ 12 марта 2011

Это связано с тем, что GDB неправильно обрабатывает событие Ctrl + C программы GUI (неконсольной).

Обходной путь можно найти в Обходной путь для прерывания GDB Ctrl-C .

4 голосов
/ 13 августа 2009

Какую «оболочку» вы используете? Если вы используете оболочку MSY "rxvt", поведение будет таким же, как вы описали. Ctrl-C работает, только если вы работаете из обычной командной строки Windows.

2 голосов
/ 13 января 2013

Я только что столкнулся с той же проблемой.

Обходной путь из вики - запустить debugbreak с pid отлаженного процесса, но ps не показывает этот pid, только pid из gdb. Может быть, есть другой способ получить его.

Но есть более простое решение. Просто запустите программу нормально (не в gdb), проверьте pid с ps и запустите gdb с этим pid в качестве второго аргумента. Когда GDB подключен, процесс останавливается, и я могу напечатать backtrace.

1 голос
/ 03 февраля 2015

Вот решение, которое работает каждый раз:

Когда GDB начинает использовать это регулярное выражение, чтобы получить подчиненный идентификатор процесса:

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

Тогда используйте:

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

Посмотрите на следующий скрипт инициализации GDB, он необходим для работы с 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)
0 голосов
/ 25 августа 2017

Как заметил Мэтью Тэлберт , это происходит, когда GDB, созданный с помощью встроенного набора инструментов MinGW, используется внутри MSYS / Cygwin. Запуск GDB с winpty работал как шарм, поскольку это инструмент, предназначенный именно для этого. Это также работало для cdb.exe.

0 голосов
/ 02 апреля 2009

Чтобы найти бесконечный цикл, вы можете попробовать пошагово выполнить выполнение, пока не доберетесь до последовательности, которая повторяется бесконечно.

Я не уверен, но я думаю, что Ctrl-C должен только остановить выполнение, а не сам GDB ...

Я думаю, что есть команда "handle", которую вы можете использовать для управления обработкой сигнала прерывания.

...