在MinGW的GDB中,如何让Ctrl-C停止程序?

时间:2009-04-02 18:46:21

标签: gdb mingw

我在Windows上,在MinGW下构建的可执行文件上运行GDB。该程序具有无限循环。我想通过点击 Ctrl + C 来找到它。当我这样做时,程序和GDB都会退出。关于这个主题的所有帮助似乎都假设我在Linux上。

8 个答案:

答案 0 :(得分:7)

这是因为GDB没有正确处理GUI(非控制台)程序的 Ctrl + C 事件。

您可以在 Workaround for GDB Ctrl-C Interrupt 中找到解决方法。

答案 1 :(得分:4)

你使用哪种“外壳”?如果你使用MSYS“rxvt”shell,那么行为就像你描述的那样。只有从正常的Windows命令提示符运行时,Ctrl-C才有效。

答案 2 :(得分:2)

我刚遇到同样的问题。

wiki的解决方法是使用调试过程的pid运行debugbreak,但ps不显示此pid,只显示gdb的pid。也许还有另一种方法可以获得它。

但是有更简单的解决方法。只需正常启动程序(不在gdb中),检查来自ps的pid并以此pid作为第二个参数启动gdb。 当附加gdb时,进程停止,我可以打印回溯。

答案 3 :(得分:1)

这是一个每次都有效的解决方案:

当GDB开始使用此正则表达式来捕获劣质进程ID:

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

然后使用:

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

查看以下GDB初始化脚本,需要在Windows 7及更高版本上使用MinGW:

# =====================================
#  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)

答案 4 :(得分:1)

如果您从https://www.msys2.org/安装了最新的 MinGW-x64 ,则 Ctrl - C 才有效。

add_action( 'woocommerce_order_status_cancelled', 'prefix_order_cancelled_hook' );

function prefix_order_cancelled_hook($order_id){
    // get an instance of an WC_Order object
    $order = wc_get_order( $order_id );
    // get the ID of the order
    $order_id = $order->get_id();
    write_log("Order ${order_id} has been cancelled")
}

如果您在 Cygwin 中,则需要将c:\test>gdb a.exe GNU gdb (GDB) 7.11.1 . . . Reading symbols from a.exe...done. (gdb) r Starting program: c:\test\a.exe <Ctrl>-<C> Thread 5 received signal SIGINT, Interrupt. [Switching to Thread 17312.0x5614] 0x00007ff97e75d7e3 in TlsGetValue () from C:\WINDOWS\System32\KernelBase.dll (gdb) 告诉gdb

handle SIGINT

答案 5 :(得分:0)

要找到无限循环,您可以尝试逐步执行,直到找到无限重复的序列。

我不确定,但我认为Ctrl-C应该只停止执行,而不是gdb本身......

我认为有一个“句柄”命令可用于控制中断信号的处理方式。

答案 6 :(得分:0)

作为Matthew Talbert pointed out,当使用本机MinGW工具链构建的GDB在MSYS / Cygwin中使用时,会发生这种情况。使用winpty启动GDB就像一个魅力,因为它是专为此设计的工具。它也适用于import numpy as np # create data nrows = 100 ncols = 4 arr = np.random.rand(nrows, ncols) # create indices and shuffle indices = np.arange(nrows) np.random.shuffle(indices) # in-place operation! # loop over shuffled indices, do stuff with array for ii in indices: print ii, arr[[ii-1, ii, (ii+1) % nrows]] # (ii+1) % nrows to handle edge case (through wrap around)

答案 7 :(得分:0)

我有同样的问题。为我解决的是将gdb与cmd.exe一起使用,并在gdb中设置以下选项。

set new-console on

现在,我可以使用 Ctrl + c 来中断gui和控制台程序。