Comment continuer un thread à la fois lors du débogage d'un programme multithread dans GDB?
J'ai un programme qui utilise deux fils. J'ai mis le point de rupture dans les deux threads. Lors de l'exécution du programme sous gdb je veux passer entre les filets et les faire exécuter.
(thread t1 qui est actif et en cours d'exécution et le thread t2; quand on est en pause sur le point d'arrêt. Je veux arrêter de T1 en cours d'exécution et exécuter le T2).
Est-il possible que je peux planifier les threads dans gdb?
Voir le GDB page de manuel de Débogage des Programmes avec Plusieurs Threads, plus précisément vous voulez utiliser le
thread
commande pour changer le thread actif.OriginalL'auteur Arpit | 2010-04-15
Vous devez vous connecter pour publier un commentaire.
Par défaut, GDB s'arrête tous les threads lorsque le point d'arrêt est atteint, et reprend tous threads lorsque vous émettez une commande (comme
continue
,next
,step
,finish
, etc.) ce qui implique que la dégradation du processus (celui que vous êtes le débogage) de commencer à exécuter.Cependant, vous pouvez dire GDB de ne pas le faire:
De sorte que vous aurez envie de définir des points d'arrêt, puis
set scheduler-locking on
, puiscontinue
oufinish
dans le thread 1 (filetage 2 est à l'arrêt), puis Ctrl-C pour reprendre le contrôle de GDB, basculez vers le thread 2,continue
(thread 1 est à l'arrêt), etc.Méfiez-vous: par la mise en
scheduler-locking on
il est très facile de provoquer le vulgaire le processus d'auto-blocage.OriginalL'auteur Employed Russian
Si vous êtes à l'aide de GDB 7 ou ultérieur, essayez de "non-stop mode".
http://sourceware.org/gdb/current/onlinedocs/gdb/Non_002dStop-Mode.html
Le "planificateur de verrouillage de la commande" mentionné précédemment permet l'étape un thread avec les autres arrêtés. Non-stop mode vous permet de l'étape un thread avec les autres actifs.
OriginalL'auteur PFee
utilisation conditions d'arrêt
voir Débogage avec GDB
Edit:
Vous pouvez placer ces commandes à l'intérieur d'un .gdbrc fichier.
(gdb) break <thread_function_entry_point> taraudage / filetage 2 (gdb) break <thread_function_entry_point> thread 1 (gdb) thread 1 (gdb) continuer (gdb) ... le thread 1 finitions (gdb), le thread 2 (gdb) continuer
Cela ne fonctionnera pas: 'continuer' (par défaut) cv tous threads.
OriginalL'auteur fabrizioM