2009-04-02 46 views

Trả lời

6

Đ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

+0

Xin cảm ơn. Tôi sẽ thử! –

+1

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

0

Để 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ý.

+0

Tôi biết. Tôi đã hy vọng không phải làm điều đó. –

+0

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. –

3

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.

+0

Đó 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ử. –

+0

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/ –

2

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.

+1

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. –

0

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) 
0

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

Các vấn đề liên quan