2009-04-15 10 views
29

Estoy usando interfaces jdi para crear un depurador y cuando uso MethodEntryRequests para habilitar el rastreo de entrada del método, el programa depurado se desacelera por factor de decenas. He configurado el filtro para el hilo principal y la política de suspensión SUSPEND_EVENT_THREAD. Classfilter es limitado y si imprimo cualquier evento recibido, no muestra más de un par de docenas de ellos, por lo que no debería recibir demasiados. Estoy depurar localmente y tener followind tipo de línea de comandos con el programa java depurado:¿Por qué el programa depurado se desacelera tanto cuando se usa la depuración de entrada de método?

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

+0

buena pregunta. Noté que los puntos de interrupción de la entrada del método disminuyen considerablemente las cosas cuando estoy depurando programas Java con Eclipse. ¡Espero que alguien tenga la respuesta! –

+0

¿Ha mejorado la situación en las versiones recientes de Java o es la misma? – WSS

Respuesta

30

La respuesta corta es que la ejecución se ejecuta a través del intérprete cuando se establecen las entradas del método. No creo que de todos modos haya alrededor de esto ...

Esto solía ser el caso para todos los códigos que se ejecutan en modo de depuración pero it was enhanced in 1.4 ... ahora HotSpot funciona para la depuración a "velocidad completa", excepto en el caso de entradas y salidas de métodos, puntos de observación y pasos únicos o en métodos que contienen puntos de interrupción.

+1

Realmente solo tiene sentido ... HotSpot hace todo tipo de cosas agradables en el código de compilación para acelerarlo (incluidos los métodos de alineación que borran los límites entre los métodos involucrados). Además de eso, es adaptable, por lo que entre ejecuciones puede cambiar cómo se ejecuta un método. Definitivamente no es algo que quieras que suceda cuando estás en medio de la depuración. – Ichorus

5

yo supongo que el depurador necesita despertar para cada llamada a un método para ver si coincide con el uno (s) que fueron seleccionados para romperse. Debido a que tiene que verificar cada método de llamada para una coincidencia potencial antes de que pueda ejecutarse, es considerablemente más lento que si no tiene que hacer todas estas comprobaciones.

9

2 razones:

  1. tiene que añadir los controles de cada entrada método (no hay opción de ajustar sólo algunos métodos)
  2. método de procesos en línea se hace imposible (métodos tan pequeñas series 10-100x veces más lento)

mismo va a perfiladores y aplicaciones .NET

+1

¿Por qué el método de en línea se vuelve imposible? –

+4

Porque el método de alineación significa que ya no tiene ese método: todo su contenido estará EN LÍNEA en todos los lugares desde los que está llamando y no se invocará ningún método. Pero el depurador necesita ese método porque es el lugar donde está tomando el lugar. – Mash

+0

Suena válido pero no suena lo suficientemente fuerte para mí. El método INLINED aún puede ser rastreado por el depurador? Técnicamente, ¿debería saber el método de inclusión en el que está siendo alineado? –

Cuestiones relacionadas