2009-04-15 6 views
29

J'utilise des interfaces jdi pour créer un débogueur et lorsque j'utilise MethodEntryRequests pour activer le traçage d'entrée de méthode, le programme débogué ralentit par un facteur de dizaines. J'ai défini le filtre pour le thread principal et suspendu la stratégie à SUSPEND_EVENT_THREAD. Classfilter est limité et si j'imprime un événement reçu, il n'en affichera pas plus de deux douzaines, donc il ne devrait pas en recevoir trop. Je suis mise au point localement et ayant followind type de commande en ligne avec le programme java débogué:Pourquoi le programme débogué ralentit-il autant en utilisant le débogage d'entrée de méthode?

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=y,server=y,address=1337

+0

Bonne question. J'ai remarqué que les points d'arrêt d'entrée de méthode ralentissaient considérablement lorsque je déboguais des programmes Java avec Eclipse. J'espère que quelqu'un a la réponse! –

+0

La situation s'est-elle améliorée dans les versions récentes de Java ou est-ce la même chose? – WSS

Répondre

30

La réponse courte est que l'exécution passe par l'interpréteur lorsque les entrées de méthode sont définies. Je ne pense pas qu'il existe de toute façon autour de cela ...

Cela a été le cas pour tout le code en mode débogage mais it was enhanced in 1.4 ... maintenant HotSpot fonctionne pour le débogage 'full-speed' sauf dans le cas de les entrées et les sorties de méthode, les points de surveillance et les étapes simples ou les méthodes contenant des points d'arrêt.

+1

Cela n'a vraiment de sens ... HotSpot fait toutes sortes de bonnes choses en compilant du code pour l'accélérer (y compris les méthodes de doublage qui brouillent les limites entre les méthodes impliquées). En plus de cela, il est adaptatif donc entre les exécutions comment une méthode s'exécute peut changer. Certainement pas quelque chose que vous voulez avoir lorsque vous êtes en train de déboguer. – Ichorus

5

Je suppose que le débogueur a besoin de se réveiller pour chaque appel de méthode pour voir si elle correspond à une (s) qui ont été sélectionnés pour casser. Parce qu'il doit vérifier chaque méthode appel à une correspondance potentielle avant de pouvoir l'exécuter est considérablement plus lent que si elle n'a pas à faire toutes ces vérifications.

9

2 raisons:

  1. il doit ajouter des contrôles sur chaque entrée de la méthode (il n'y a pas possibilité de modifier seulement quelques méthodes)
  2. méthode inline devient impossible (si petites méthodes s'exécute 10-100x fois plus lent)

va de même pour les profileurs et des applications .net

+1

Pourquoi la méthode Inline devient-elle impossible? –

+4

Parce que la méthode Inline signifie que vous n'avez plus cette méthode - son contenu sera INLINE dans tous les endroits à partir desquels il appelle et aucune invocation de méthode ne se produira. Mais le débogueur a besoin de cette méthode parce que c'est l'endroit où il prend la place. – Mash

+0

Cela sonne valide mais pas assez fort pour moi. Méthode INLINED peut encore être tracée par débogueur? Techniquement, il devrait connaître la méthode de clôture dans laquelle il est en ligne? –

Questions connexes