2010-04-15 23 views
15

Tengo un programa que usa dos hilos. He puesto el punto de quiebre en ambos hilos. Mientras ejecuto el programa en gdb, quiero cambiar entre los hilos y hacerlos funcionar. (el hilo t1 está activo y ejecutándose y el hilo t2; cuando está en pausa en el punto de corte. Quiero detener el funcionamiento de T1 y ejecutar el T2).gdb: multihilo

¿Hay alguna manera de programar los hilos en gdb?

Gracias arpit

+0

Consulte la página de manual de GDB en [Programas de depuración con varios hilos] (http://sourceware.org/gdb/current/onlinedocs/gdb/Threads.html#Threads), específicamente, usted quiere usar el comando 'thread' para cambiar el hilo activo – Hasturkun

Respuesta

1

condiciones de uso de quiebre

(gdb) break frik.c:13 thread 28 if bartab > lim 

ver Debugging with GDB

Editar:

(gdb) break <thread_function_entry_point> thread 2 
(gdb) break <thread_function_entry_point> thread 1 
(gdb) thread 1 
(gdb) continue 
(gdb) ... thread 1 finishes 
(gdb) thread 2 
(gdb) continue 

Usted puede poner estos comandos en un archivo .gdbrc.

+0

Mi requisito es que quiero que un hilo termine primero y luego empiece a ejecutar el segundo. – Arpit

+0

(GDB) descanso hilo 2 (GDB) descanso hilo 1 (GDB) hilo 1 (GDB) continuar (GDB) ... hilo 1 acabados (GDB) hilo 2 (gdb) continue – fabrizioM

+0

Esto no funcionará: 'continuar' (por defecto) reanuda * todos * hilos. –

25

Por defecto, el BGF detiene todas las discusiones cuando se golpea cualquier punto de interrupción, y se reanuda la todos los hilos cuando se emite un comando (como continue, next, step, finish, etc.), que requiere que el proceso inferior (la uno que está depurando) comienzan a ejecutarse.

Sin embargo, se puede decir BGF no hacer eso:

(gdb) help set scheduler-locking 
Set mode for locking scheduler during execution. 
off == no locking (threads may preempt at any time) 
on == full locking (no thread except the current thread may run) 
step == scheduler locked during every single-step operation. 
    In this mode, no other thread may run during a step command. 
    Other threads may run while stepping over a function call ('next'). 

así que es conveniente establecer puntos de interrupción, entonces set scheduler-locking on, entonces continue o finish en hilo de 1 (rosca 2 está siendo detenido), entonces Ctrl-C para recuperar el control de GDB, cambiar a rosca 2, continue (hilo 1 está todavía parado), etc.

Cuidado: configurando scheduler-locking on es muy fácil de hacer que el proceso de inferior a la auto-bloqueo.