我在Windows上,在MinGW下构建的可执行文件上运行GDB。该程序具有无限循环。我想通过点击来找到它 按Ctrl + C。当我这样做时,程序和GDB都会退出。关于这个主题的所有帮助似乎都假设我在Linux上。
我在Windows上,在MinGW下构建的可执行文件上运行GDB。该程序具有无限循环。我想通过点击来找到它 按Ctrl + C。当我这样做时,程序和GDB都会退出。关于这个主题的所有帮助似乎都假设我在Linux上。
这是因为GDB没有处理 按Ctrl + C GUI(非控制台)程序的事件正确。
您可以在中找到解决方法 GDB Ctrl-C中断的解决方法。
这是因为GDB没有处理 按Ctrl + C GUI(非控制台)程序的事件正确。
您可以在中找到解决方法 GDB Ctrl-C中断的解决方法。
你使用哪个“外壳”?如果你使用MSYS“rxvt”shell,那么行为就像你描述的那样。只有从正常的Windows命令提示符运行时,Ctrl-C才有效。
我刚刚遇到同样的问题。
来自wiki的解决方法是运行 debugbreak
使用调试过程的pid,但是 ps
没有显示这个pid,只显示gdb的pid。也许还有另一种方法可以获得它。
但是有更简单的解决方法。只需正常启动程序(不在gdb中),检查pid ps
并以此pid作为第二个参数启动gdb。
当附加gdb时,进程停止,我可以打印回溯。
这是一个每次都有效的解决方案:
当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)
要找到无限循环,您可以尝试逐步执行,直到找到无限重复的序列。
我不确定,但我认为Ctrl-C应该只停止执行,而不是gdb本身......
我认为有一个“句柄”命令可用于控制中断信号的处理方式。
如 马修塔尔伯特指出当使用本机MinGW工具链构建的GDB在MSYS / Cygwin中使用时,会发生这种情况。使用winpty启动GDB就像一个魅力,因为它是专为此设计的工具。它也有用 cdb.exe
。