Domanda

E 'possibile che il debugger (o il gestore di eccezioni CLR) per mostrare la linea dove l'eccezione è accaduto in modalità di rilascio utilizzando il PDB?

Il codice, in modalità di rilascio, è ottimizzato e non sempre seguire l'ordine e la logica del codice "originale".

E 'anche sorprendente che il debugger può navigare attraverso il mio codice passo dopo passo, anche in modalità di rilascio. L'ottimizzazione dovrebbe rendere la navigazione molto inconfortable.

La prego di chiarire questi due punti per me?

È stato utile?

Soluzione

Non sono più a conoscenza di come questo viene fatto con CLR, ma è probabilmente molto simile a come si fa con codice nativo. Quando il compilatore genera istruzioni macchina, aggiunge voci al PPB che in fondo dire "l'istruzione a l'indirizzo corrente, X, è venuto dalla linea 25 in foo.cpp".

Il debugger sa quale indirizzo programma è attualmente in esecuzione. Quindi sembra un po 'di indirizzo, X, nel PPB e vede che è venuto dalla linea 25 in foo.cpp. Usando questo, è in grado di "step" attraverso il codice sorgente.

Questo processo è lo stesso indipendentemente dalla modalità di rilascio debug o (a condizione che un PPB viene generato affatto in modalità di rilascio). Hai ragione, però, che spesso in modalità di rilascio a causa di ottimizzazioni il debugger non farà un passo "lineare" attraverso il codice. Potrebbe saltare alle linee differenti in modo imprevisto. Ciò è dovuto al l'ottimizzatore cambiare l'ordine delle istruzioni, ma non cambia l'indirizzo di mappatura-a-fonte-line, in modo che il debugger è ancora in grado di seguirlo.

Altri suggerimenti

[@ Non saprei] ha quasi giusto. Il compilatore fa un massimo sforzo di individuare un numero di riga appropriata che si avvicina l'istruzione di codice macchina corrente.

Il PPB e il debugger non si sa nulla di ottimizzazioni; il file PDB mappe essenzialmente posizioni di indirizzo in codice macchina per i numeri di riga di codice sorgente. Nel codice ottimizzato, non è sempre possibile corrispondere esattamente un'istruzione assieme ad una specifica linea di codice sorgente, in modo che il compilatore scriverà al PPB la cosa più vicina che ha a portata di mano. Questo potrebbe essere "la riga del codice sorgente prima", o "la linea di codice sorgente del contesto che racchiude (loop, ecc)", o qualcosa d'altro.

In ogni caso, il debugger trova essenzialmente la voce nel PDB mappa più vicino (come in "prima di o uguale") per l'IP (Instruction Pointer) attuale e mette in evidenza che la linea.

A volte la partita non è molto buona, e questo è quando si vede l'area evidenziata saltare tutto il luogo.

Il debugger fa una supposizione best-effort in cui si è verificato il problema. Non è garantito per essere accurato al 100%, e con il codice ottimizzato, spesso sarà imprecisa -. Ho trovato le inesattezze che vanno da poche righe fuori ad avere uno stack di chiamata del tutto sbagliato

Come precisa il debugger è con codice ottimizzato in realtà dipende dal codice stesso e quali ottimizzazioni che stai facendo.

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