Perché il programma di debug rallentare così tanto quando si utilizza l'ingresso di debug metodo?

StackOverflow https://stackoverflow.com/questions/751105

  •  09-09-2019
  •  | 
  •  

Domanda

Sto utilizzando interfacce JDI per creare un debugger e quando uso MethodEntryRequests per abilitare il metodo ingresso tracciando il programma di debug rallenta per il fattore di decine. Ho impostato filtro per thread principale e sospendere la politica di SUSPEND_EVENT_THREAD. Classfilter è limitato e se stampo eventi ricevuti non mostra più di due dozzine di quelli per cui non dovrebbe ricevere troppo di loro. Sto debug a livello locale e dopo aver followind tipo di riga di comando con il programma Java debug:

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

È stato utile?

Soluzione

La risposta breve è che l'esecuzione attraversa l'interprete, quando sono impostate le voci di metodo. Non penso che ci sia comunque intorno a questo ...

Questo era il caso per tutto il codice in esecuzione in modalità di debug, ma è stata arricchita in 1,4 ... ora HotSpot lavora per il debugging 'piena velocità' tranne nel caso di ingressi e uscite metodo, e quando watchpoints singolo passo o metodi che contengono i punti di interruzione.

Altri suggerimenti

2 motivi:

  1. deve aggiungere controlli su ogni voce di metodo (Non v'è alcuna opzione per modificare solo alcuni metodi)
  2. metodo inline diventa impossibile (Così piccoli metodi corre 10-100x volte più lento)

stesso vale per i profiler e applicazioni .net

Parto dal presupposto che il debugger ha bisogno di svegliarsi per ogni chiamata di metodo per vedere se corrisponde a quello (s), che sono stati selezionati per rompere. Perché deve controllare ogni chiamata di metodo per un potenziale incontro prima che possa eseguirlo è notevolmente più lento rispetto se non hanno a che fare tutti questi controlli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top