Tôi đang sử dụng Windows, chạy GDB trên một tệp thực thi được xây dựng theo MinGW. Chương trình có vòng lặp vô hạn. Tôi muốn tìm nó bằng cách nhấn Ctrl-C. Khi tôi làm, cả hai chương trình và GDB thoát. Tất cả sự giúp đỡ về chủ đề này dường như giả sử tôi đang trên Linux.Trong GDB trên MinGW, làm thế nào để làm cho Ctrl-C dừng chương trình?
Trả lời
Điều này là do gdb không xử lý sự kiện ctrl-c của chương trình GUI (không phải bàn điều khiển) đúng cách. Bạn có thể tìm giải pháp tại đây http://www.mingw.org/wiki/Workaround_for_GDB_Ctrl_C_Interrupt
Để tìm vòng lặp vô hạn, bạn có thể thử bước qua thực hiện cho đến khi bạn nhận được một chuỗi lặp lại vô thời hạn.
Tôi không chắc chắn, nhưng tôi nghĩ rằng tổ hợp phím Ctrl-C chỉ nên dừng việc thực hiện, không gdb chính nó ...
Tôi nghĩ rằng có một "xử lý" lệnh mà bạn có thể sử dụng để kiểm soát cách ngắt tín hiệu được xử lý.
Tôi biết. Tôi đã hy vọng không phải làm điều đó. –
Bạn đang ở trên cả hai tính, nhưng nó dường như không hoạt động trong một hộp Windows DOS. –
Bạn đang sử dụng "trình bao" nào? Nếu bạn sử dụng MSYS "rxvt" shell, hành vi này là khá nhiều như bạn mô tả. Ctrl-C chỉ hoạt động nếu bạn đang chạy từ một dấu nhắc lệnh Windows bình thường.
Đó là thông tin hữu ích. Tôi đang ở một dấu nhắc lệnh Windows, và nó không có vẻ làm việc, nhưng tôi sẽ cung cấp cho nó một thử. –
Bạn cũng có thể thử "Console2". Điều này sẽ hoạt động gần dấu nhắc lệnh của Windows, nhưng nó đẹp hơn rất nhiều. Tôi sử dụng gdb tất cả các thời gian với điều đó, và không bao giờ có bất kỳ vấn đề. https://sourceforge.net/projects/console/ –
Tôi vừa mới gặp phải vấn đề tương tự.
Cách giải quyết từ wiki là chạy debugbreak
với pid của quá trình gỡ lỗi, nhưng ps
không hiển thị pid này, chỉ pid của gdb. Có lẽ có một cách khác để có được nó.
Nhưng có giải pháp đơn giản hơn. Chỉ cần bắt đầu chương trình bình thường (không phải trong gdb), kiểm tra pid từ ps
và bắt đầu gdb với pid này làm đối số thứ hai. Khi gdb được gắn quá trình dừng lại và tôi có thể in backtrace.
Cảm ơn. Một số thời gian trước đây tôi nhấn vào đây: Nhấn^C và trình gỡ rối dừng lại, nhưng nó dừng lại trong một chủ đề khác với chương trình chính. , nó cho biết số luồng của chương trình chính.Sau đó, tôi chuyển sang chủ đề đó và tôi có thể thực hiện 'bt' để hiển thị ngăn xếp. Tôi cho rằng nó hoàn toàn hiển nhiên đối với bất kỳ ai thực sự biết GDB. –
Dưới đây là một giải pháp mà làm việc mỗi thời gian:
Khi GDB bắt đầu sử dụng biểu thức chính quy này để nắm bắt được quá trình id kém:
"\[New Thread (\d+)\."
Sau đó sử dụng:
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);
DebugBreakProcess(hProcess);
CloseHandle(hProcess);
Có một hãy xem tập lệnh khởi tạo GDB sau, bắt buộc phải làm việc với MinGW trên Windows 7 trở lên:
# =====================================
# 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)
Như Matthew Talbert đã chỉ ra điều này xảy ra khi GDB được xây dựng với chuỗi công cụ MinGW gốc được sử dụng bên trong MSYS/Cygwin. Bắt đầu từ gdb với winpty làm việc như một sự quyến rũ vì nó là một công cụ được thiết kế chỉ cho điều đó. Cũng đã làm việc cho cdb.exe
Xin cảm ơn. Tôi sẽ thử! –
Quá xấu, bạn chỉ có thể sử dụng giải pháp khắc phục sự cố để gỡ lỗi chương trình Windows. Đối với tôi, tôi đang gỡ lỗi một chương trình Android: ( – Qwertie