IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

[jdb] suivre un thread


Sujet :

Java

  1. #1
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut [jdb] suivre un thread
    Bonjour a tous,

    Je suis en train d'etudier le comportement d'une application multithreadee dont je ne possede pas les sources. Je peux m'attacher sans probleme a la JVM a l'aide de JDB. Je peux placer mes points d'arrets dans le thread parent. Le probleme, s'est que lorsqu'une nouvelle connection arrive, le thread parent lance la tache associee dans un thread enfant. Du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /*  87 */   private ThreadPoolExecutor threadPoolExecutor = null;
     
    /* 249 */           SocketProcessTask task = this.socketProcessTaskFactory.createSocketProcessTask(service, socket, this.inbound, this.outbound);
    /*     */ 
    /* 251 */           this.threadPoolExecutor.execute(task);
    A ce moment la task.run() est appele dans un nouveau thread, et jdb rend la main. Je ne peux pas faire de pas a pas dans ce thread pour suivre ma connection.

    Y'a-t-il une astuce pour suivre les threads "enfants"?

    Merci.

  2. #2
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Je me reponds.
    Alors en fait ce n'est pas possible avec JDB.
    GDB permet de faire cela sur certaines architectures a l'aide de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set scheduler-locking on
    , ce qui permet de ne faire tourner qu'un thread a la fois en step by step. Ca permet de trouver facilement l'identifiant du thread cree.

    JDB ne permet pas cette possibilite. Bref, la technique que j'utilise est de poser un point d'arret sur la method run() de la classe implementant Runnable. Comme ca lorsque le ThreadPoolExecutor decide de creer le nouveau thread, ou de lancer la tache a l'interieur d'un thread pool existant, en appelant run(), je break dans le bon thread.
    Le probleme etant que c'est verbeux, il faut donc poser un break condition, sur l'IP source pour moi.

    Par l'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /* Une classe qui est en charge de scheduler des taches */
    /*  87 */   private ThreadPoolExecutor threadPoolExecutor = null;
     
    /* 249 */           SocketProcessTask task = this.socketProcessTaskFactory.createSocketProcessTask(service, socket, this.inbound, this.outbound);
    /*     */ 
    /* 251 */           this.threadPoolExecutor.execute(task);
     
    /* Une classe qui execute une tache dans un autre thread: */
    public class SocketProcessTask implements Runnable
    /*    */ {
    /*    */   public void run()
    /*    */   {
    Dans JDB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    > threads main
    Group main:
      (java.lang.Thread)0x1                                        main                                         running
      (java.lang.Thread)0x1b9e                                     pool-5-thread-1                              cond. waiting
      (java.lang.Thread)0x1b9d                                     pool-6-thread-1                              cond. waiting
      (java.lang.Thread)0x1b9c                                     pool-8-thread-1                              cond. waiting
      (java.lang.Thread)0x1b9b                                     pool-9-thread-1                              cond. waiting
      (java.lang.Thread)0x1b9a                                     pool-10-thread-1                             cond. waiting
      (java.lang.Thread)0x1b99                                     pool-7-thread-1                              cond. waiting
      (java.lang.Thread)0x1b98                                     pool-11-thread-1                             cond. waiting
      (com.package.Server$1)0x1b88               Server$$EnhancerByCGLIB$$e6b7daa5-8080 running
    ....
    ....
     
    >suspend
    > stop in com.package.SocketProcessTask.run
    Set breakpoint com.package.SocketProcessTask.run
    > thread 0x1b88
    Server$$EnhancerByCGLIB$$e6b7daa5-8080[1] resume
     
    /* Generer du traffic reseau pour forcer la creation d'un thread, et... */
    Breakpoint hit: "thread=pool-27-thread-3-3", com.package.SocketProcessTask.run(), line=158 bci=0
     
    /* Inspection */
    JDB est relativement horrible a prendre en main. Non scriptable et horrible niveau ergonomie. Mais je devrais pouvoir m'en sortir maintenant.

    L'astuce est relativement evidente maintenant que j'y pense, mais c'est toujours comme ca.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment suivre l'execution d'un seul thread
    Par ikuzar dans le forum GDB
    Réponses: 0
    Dernier message: 04/04/2013, 10h29
  2. Suivre l'état d'un Thread
    Par khouja dans le forum VB.NET
    Réponses: 1
    Dernier message: 15/04/2009, 08h01
  3. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo