2009-04-02 10 views

Respuesta

6

Esto se debe a que gdb no maneja el evento ctrl-c del programa GUI (sin consola) correctamente. Puede encontrar la solución aquí http://www.mingw.org/wiki/Workaround_for_GDB_Ctrl_C_Interrupt

+0

Hola, gracias. ¡Lo probaré! –

+1

Lástima que solo puede usar la solución alternativa para depurar un programa de Windows. En cuanto a mí, estoy depurando un programa de Android :( – Qwertie

0

Para encontrar el bucle infinito, puede intentar recorrer la ejecución hasta llegar a una secuencia que se repite indefinidamente.

No estoy seguro, pero creo que Ctrl-C sólo debe detener la ejecución, no GDB sí ...

Creo que hay una "manija" de comandos que puede utilizar para controlar cómo la interrupción se maneja la señal.

+0

Lo sé. Esperaba no tener que hacer eso. –

+0

Tiene razón en ambos aspectos, pero no parece funcionar en un Windows DOS-box. –

3

¿Qué "shell" estás usando? Si utiliza el shell MSYS "rxvt", el comportamiento es más o menos como usted describe. Ctrl-C solo funciona si está ejecutando desde un símbolo del sistema normal de Windows.

+0

Esa es información útil. Estoy en un símbolo del sistema de Windows, y no pareció funcionar, pero lo intentaré de nuevo. –

+0

También puedes probar "Console2". Esto debería comportarse cerca del símbolo del sistema de Windows, pero es mucho más bonito. Uso gdb todo el tiempo con eso, y nunca tengo ningún problema. https://sourceforge.net/projects/console/ –

2

Acabo de llegar al mismo problema.

La solución del wiki es ejecutar debugbreak con el pid del proceso depurado, pero ps no muestra este pid, solo pid de gdb. Tal vez hay otra forma de obtenerlo.

Pero hay una solución más simple. Simplemente inicie el programa normalmente (no en gdb), marque pid desde ps e inicie gdb con este pid como segundo argumento. Cuando se adjunta gdb, el proceso se detiene y puedo imprimir la traza inversa.

+1

Gracias. Hace algún tiempo toqué esto: Hit^C y el depurador se detiene, pero se detiene en un hilo diferente al del programa principal. Si hago hilos de información , le dice el número de hilo del programa principal.Luego cambio a ese hilo, y puedo hacer 'bt' para mostrar la pila. Supongo que es totalmente obvio para cualquiera que realmente conozca GDB. –

0

Aquí es una solución que funciona todo el tiempo:

Cuando BGF comienza utilizar esta expresión regular para capturar el inferior Identificación del proceso:

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

A continuación, utilice:

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

Tener una Consulte la siguiente secuencia de comandos de inicialización de GDB, se requiere para que esto funcione con MinGW en Windows 7 y posterior:

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

Como señaló Matthew Talbert, esto sucede cuando se usa GDB con la herramienta de trabajo MinGW nativa dentro de MSYS/Cygwin. Iniciar gdb con winpty funcionó como un hechizo ya que es una herramienta diseñada solo para eso. También funcionó para cdb.exe

Cuestiones relacionadas