web-dev-qa-db-fra.com

Débogage de plusieurs threads dans Eclipse

Dans une méthode que je débogue, j'engendre un nouveau thread. J'ai besoin de déboguer l'exécution de ce nouveau thread plutôt que le thread parent. Comment puis-je faire cela dans Eclipse?

59
Shailesh Tainwala

Mettez un point d'arrêt sur la méthode "run" du nouveau thread. Cela arrêterait l'exécution une fois le thread démarré.

36
Shamit Verma

En plus de la réponse de Shamit Verma:

Lors du débogage d'applications multi-thread Java , il est préférable de ne pas utiliser de points d'arrêt standard qui suspendent uniquement le thread où le point d'arrêt est défini. La définition d'un point d'arrêt standard dans votre application ne cassera que le thread associé. Les autres threads seront toujours en cours d'exécution. Dans le débogueur Eclipse, pour une raison quelconque, le débogueur ignorera les points d'arrêt si d'autres threads ont déjà démarré.

La solution pour déboguer Java:

Définissez un point d'arrêt dans le thread souhaité (méthode @ Run () que j'attends ..), faites un clic droit sur le point d'arrêt -> propriétés du point d'arrêt.

Dans la boîte de dialogue des propriétés du point d'arrêt, cochez "Suspendre la VM" au lieu de "Suspendre le thread".

Si vous aimez cela, l'ensemble de votre VM sera suspendu si un point d'arrêt est atteint.

Dans C/C++ CDT, utilisez définissez le verrouillage du programmateur sur :

Comme le dit @Employed Russian dans answer-to-other-question , la commande GDB:

set scheduler-locking on 

entraînera la suspension des autres threads C/C++ tout en autorisant le thread actuel à avancer. Cette commande peut être exécutée dans Eclipse/CDT Debug en suspendant l'exécution du programme et en ouvrant la perspective 'Debugger Console' et en tapant: définissez le verrouillage du programmateur surElle peut ensuite être retournée à la normale avec: désactiver le verrouillage du programmateur

Voir la documentation de GDB pour plus d'informations sur le verrouillage de planificateur et non-stopmode, qui permet aux autres threads de s'exécuter tout en arrêtant un seul thread.

176
Erik Kaju

En plus de la réponse d'Erik Kaju. Si vous déboguez CDT (cela peut être applicable pour Java également, je ne suis pas sûr de cela))

  1. Mettez un point d'arrêt sur la méthode run () (ou son équivalent). Ou à tout moment où vous êtes sûr que les threads requis et le thread non requis (ceux qui seront supprimés par le filtre) fonctionnent tous les deux.
  2. Démarrez la session de débogage.
  3. Lorsque le point d'arrêt en cours d'exécution est atteint, vous pouvez accéder à un autre point d'arrêt, activer ce point d'arrêt s'il était désactivé. Cliquez ensuite avec le bouton droit sur le point d'arrêt -> allez dans Filtres, vous pouvez maintenant sélectionner le thread pour lequel le point d'arrêt doit rester activé et vous pouvez décocher le reste des threads. Ce point d'arrêt ne sera donc atteint que pour ce thread particulier.

L'inconvénient est que cette procédure doit être répétée pour chaque session de débogage. Si quelqu'un peut fournir un raccourci, ce serait bien.

4
GauravKadyan

dans votre fenêtre de débogage Eclipse, vous pouvez sauter des threads pour atterrir sur le numéro de thread de travail souhaité et continuer votre exploration séquentielle (F6). enter image description here

2
Jules Martel