2010-07-19 17 views
9

Me he encontrado con algunos problemas para depurar un proceso de subprocesos múltiples utilizando GDB. Tengo un proceso de subprocesos múltiples que se astilla en varios (8 o 9) subprocesos diferentes, y estoy tratando de determinar cuál es el contenido de las variables cuando se llama al constructor para una clase llamada XML_File_Data. Sin embargo, me encontré con un problema donde, después de aplicar el punto de corte de la función correcta a todos los hilos y es aparente que uno de los puntos de corte del hilo es golpeado (el programa detiene temporalmente la ejecución), no puedo determinar qué hilo golpear el punto de quiebre El comandoDeterminar el hilo correcto para depurar en GDB

(gdb) thread apply all where 

me está dando la información sorprendentemente inútil en la forma:

#0 0x004ab410 in __kernel_vsyscall() 
#1 0x05268996 in nanosleep() from /lib/libc.so.6 
#2 0x052a215c in usleep() from /lib/libc.so.6 
#3 0x082ee313 in frame_clock_frame_end (clock=0xb4bfd2f8) 
    at frame_clock.c:143 
#4 0x003a349a in ??() 
#5 0x00b5cfde in thread_proxy() 
    from /cets_development_libraries/install/lib/libboost_thread-gcc41-mt-1_38.so.1.38.0 
#6 0x02c1f5ab in start_thread() from /lib/libpthread.so.0 
#7 0x052a8cfe in clone() from /lib/libc.so.6 

De los 9 procesos, 7 o así me están dando casi exactamente que la producción, y la información sobre la última 2 ISN Realmente es mucho más útil (las funciones que se encuentran muy abajo de la pila de llamadas tienen nombres reconocibles, pero las funciones recientes # 0- # 4 no son reconocibles).

Esto es lo que tengo hasta ahora:

(gdb) gdb 
(gdb) gdb attach <processid> 
(gdb) thread apply all 'XML_File_Data::XML_File_Data()' 

y (después de que el punto de ruptura es golpeado)

(gdb) thread apply all where 

Podrían otras depuradores experimentados me ofrecen algunos consejos sobre lo que estoy haciendo mal o qué normalmente se hace en esta situación?

Saludos, Charlie

EDIT: Afortunadamente, pude descubrir que la causa de la ?? 's se ha optimizado código de ejecución a través del depurador, además de no ejecutar el depurador en el directorio del archivo ejecutable. Sin embargo, aún no hay mucho éxito con la depuración.

Respuesta

14

Puede utilizar el comando hilo o información roscas para averiguar el número del hilo actual después de punto de interrupción golpeó

(gdb) thread 
[Current thread is 1 (Thread 0xb790d6c0 (LWP 2519))] 
(gdb) 

(gdb) info threads 
    17 Thread 0xb789cb90 (LWP 2536) 0xb7fc6402 in __kernel_vsyscall() 
    16 Thread 0xb769bb90 (LWP 2537) 0xb7fc6402 in __kernel_vsyscall() 
    15 Thread 0xb749ab90 (LWP 2543) 0xb7fc6402 in __kernel_vsyscall() 
    14 Thread 0xb7282b90 (LWP 2544) 0xb7fc6402 in __kernel_vsyscall() 
    13 Thread 0xb5827b90 (LWP 2707) 0xb7fc6402 in __kernel_vsyscall() 
    12 Thread 0xb5626b90 (LWP 2708) 0xb7fc6402 in __kernel_vsyscall() 
    11 Thread 0xb5425b90 (LWP 2709) 0xb7fc6402 in __kernel_vsyscall() 
    10 Thread 0xb5161b90 (LWP 2713) 0xb7fc6402 in __kernel_vsyscall() 
    9 Thread 0xb4ef9b90 (LWP 2715) 0xb7fc6402 in __kernel_vsyscall() 
    8 Thread 0xb4af7b90 (LWP 2717) 0xb7fc6402 in __kernel_vsyscall() 
    7 Thread 0xb46ffb90 (LWP 2718) 0xb7fc6402 in __kernel_vsyscall() 
    6 Thread 0xb44feb90 (LWP 2726) 0xb7fc6402 in __kernel_vsyscall() 
    5 Thread 0xb42fdb90 (LWP 2847) 0xb7fc6402 in __kernel_vsyscall() 
    4 Thread 0xb40fcb90 (LWP 2848) 0xb7fc6402 in __kernel_vsyscall() 
    3 Thread 0xb3efbb90 (LWP 2849) 0xb7fc6402 in __kernel_vsyscall() 
    2 Thread 0xb3cfab90 (LWP 2850) 0xb7fc6402 in __kernel_vsyscall() 
* 1 Thread 0xb790d6c0 (LWP 2519) 0xb7fc6402 in __kernel_vsyscall() 
(gdb) 

Un asterisco `*' a la izquierda del número de hilo GDB indica el subproceso actual . Ver here.

14

me encuentro haciendo esto todo el tiempo:

> t a a f 

corto para:

> thread apply all frame 

Por supuesto, otras variantes son posibles:

> t a a bt 3 

que imprime el fondo 3 marcos de la pila de cada hilo. (También puede usar números negativos para obtener los N primeros fotogramas de la pila)

Cuestiones relacionadas