2010-04-15 21 views
15

Ich habe ein Programm, das zwei Threads verwendet. Ich habe den Breakpoint in beide Threads gelegt. Während ich das Programm unter gdb ausführe, möchte ich zwischen den Threads wechseln und sie ausführen lassen. (Thread t1 ist aktiv und läuft und Thread t2; wenn auf dem Haltepunkt pausiert. Ich möchte, dass T1 läuft und den T2 ausführen).gdb: Multithreading

Gibt es eine Möglichkeit, die Threads in gdb zu planen?

Dank Arpit

+0

Siehe die GDB-Handbuchseite zu [Debuggen von Programmen mit mehreren Threads] (http://sourceware.org/gdb/current/onlinedocs/gdb/Threads.html#Threads), speziell den Befehl 'thread' um den aktiven Thread zu wechseln. – Hasturkun

Antwort

1

Verwendung Unterbrechungsbedingungen

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

siehe Debugging with GDB

Edit:

(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 

Sie diese Befehle in einer .gdbrc Datei setzen.

+0

Meine Anforderung ist, dass ich möchte, dass ein Thread den 1. beendet und dann den zweiten startet. – Arpit

+0

(gdb) break Faden 2 (gdb) break Thema 1 (GDB) Thema 1 (GDB) weiterhin (GDB) ... Thread 1 beendet (GDB) Gewinde 2 (GDB) continue – fabrizioM

+0

Dies wird nicht funktionieren: 'Weiter' (standardmäßig) setzt * alle * Threads fort. –

25

standardmäßig GDB alle Themen stoppt, wenn ein Haltepunkt erreicht wird, und nimmt alle Threads, wenn Sie einen Befehl erteilen (wie continue, next, step, finish usw.), die erfordert, dass der untere Prozess (der Sie debuggen) starten zu starten.

Sie können jedoch GDB sagen, nicht zu tun, dass:

(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'). 

So möchten Sie Breakpoints setzen, dann set scheduler-locking on, dann continue oder finish in Thread 1 (Gewinde 2 gestoppt noch), dann Ctrl-C Steuerung von GDB wiederzuerlangen, Schalter 2, continue einzufädeln (Gewinde 1 gestoppt noch) usw.

Vorsicht: durch Einstellung scheduler-locking on es sehr einfach ist, den Prozess zu inferior Selbst deadlock zu verursachen.