Perché il programma di debug è rallentato così tanto quando si utilizza il debug delle voci di metodo?

Sto usando le interfacce jdi per creare un debugger e quando utilizzo MethodEntryRequests per abilitare il tracciamento della voce del metodo il programma debugato rallenta per il fattore decine. Ho impostato il filtro per il thread principale e il criterio di sospensione su SUSPEND_EVENT_THREAD. Classfilter è limitato e se stampo qualche evento ricevuto non ne mostra più di una dozzina, quindi non dovrebbe riceverne troppi. Sto eseguendo il debug localmente e avendo seguito un certo tipo di riga di comando con il programma java debug:

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

La risposta breve è che l’esecuzione viene eseguita attraverso l’interprete quando vengono impostate le voci del metodo. Non penso ci sia comunque intorno a questo …

Questo era il caso per tutto il codice in esecuzione in modalità di debug, ma è stato migliorato in 1.4 … ora HotSpot funziona per il debug a tutta velocità, tranne nel caso di voci di metodo e uscite, punti di controllo e quando singolo stepping o in metodi che contengono punti di interruzione.

2 motivi:

  1. deve aggiungere controlli su ogni voce di metodo (non vi è alcuna possibilità di modificare solo alcuni metodi)
  2. l’allineamento del metodo diventa imansible (quindi i metodi più piccoli vengono eseguiti 10-100 volte più lentamente)

lo stesso vale per i profiler e le app .net

Suppongo che il debugger abbia bisogno di svegliarsi per ogni chiamata al metodo per vedere se corrisponde a quella selezionata per interromperla. Perché deve verificare che ogni chiamata di metodo per una potenziale corrispondenza prima che possa eseguirla è molto più lenta di se non deve fare tutti questi controlli.