Evitare ricerche del debugger per simboli non necessari
Ultimo aggiornamento:
- 27 maggio 2007
Si arriva a un punto di interruzione interessante durante il debug del driver, solo per avere la pausa del debugger per molto tempo mentre tenta di caricare simboli per i driver che non sono proprietari e che non importa nemmeno per l'attività di debug a mano. Cosa è successo?
Per impostazione predefinita, i simboli vengono caricati dal debugger in base alle esigenze. Viene chiamato caricamento di simboli posticipati o caricamento di simboli lazy. Il debugger cerca i simboli ogni volta che esegue un comando che chiama la visualizzazione dei simboli. Ciò può verificarsi in un punto di interruzione se è stata impostata una variabile watch non valida nel contesto corrente, ad esempio un parametro di funzione o una variabile locale che non esiste nel frame dello stack corrente, perché diventano non validi quando il contesto cambia. Può verificarsi anche se si digita semplicemente un nome di simbolo o si esegue un comando debugger non valido- il debugger inizia a cercare un simbolo corrispondente.
Perché questo a volte richiede molto tempo? Ciò dipende dal fatto che il nome del simbolo sia qualificato o non qualificato. Un nome di simbolo qualificato è preceduto dal nome del modulo che contiene il simbolo, ad esempio myModule!myVar. Un nome di simbolo non qualificato non specifica un nome del modulo, ad esempio myOtherVar.
Nel caso del nome qualificato, il debugger cerca il simbolo nel modulo specificato e, se il modulo non è già caricato, carica il modulo (presupponendo che il modulo esista e contenga il simbolo). Ciò avviene abbastanza rapidamente.
Nel caso di un nome non qualificato, il debugger non conosce il modulo che contiene il simbolo, quindi deve essere visualizzato in tutti. Il debugger controlla prima tutti i moduli caricati per il simbolo e quindi, se non riesce a corrispondere al simbolo in qualsiasi modulo caricato, il debugger continua la ricerca caricando tutti i moduli non caricati, a partire dall'archivio downstream e terminando con il server di simboli, se ne si usa uno. Ovviamente, questo può richiedere molto tempo.
Come impedire il caricamento automatico per i simboli non qualificati
L'opzione SYMOPT_NO_UNQUALIFIED_LOADS disabilita o abilita il caricamento automatico dei moduli del debugger quando cerca un simbolo non qualificato. Quando SYMOPT_NO_UNQUALIFIED_LOADS è impostato e il debugger tenta di corrispondere a un simbolo non qualificato, cerca solo i moduli già caricati e arresta la ricerca quando non riesce a corrispondere al simbolo, anziché caricare moduli non caricati per continuare la ricerca. Questa opzione non influisce sulla ricerca di nomi qualificati.
SYMOPT_NO_UNQUALIFIED_LOADS è disattivato per impostazione predefinita. Per attivare questa opzione, usare l'opzione della riga di comando -snul o, mentre il debugger è in esecuzione, usare rispettivamente .symopt+0x100 o .symopt-0x100 per attivare o disattivare l'opzione.
Per visualizzare l'effetto di SYMOPT_NO_UNQUALIFIED_LOADS, provare questo esperimento:
- Attivare il caricamento di simboli rumorosi (SYMOPT_DEBUG) usando l'opzione -n della riga di comando o, se il debugger è già in esecuzione, usare .symopt+0x80000000 o il comando di estensione del debugger rumoroso !sym . SYMOPT_DEBUG indica al debugger di visualizzare informazioni sulla relativa ricerca di simboli, ad esempio il nome di ogni modulo quando viene caricato o un messaggio di errore se il debugger non riesce a trovare un file.
- Indicare al debugger di valutare un simbolo inesistente, ad esempio digitare ?asdasdasd. Il debugger deve segnalare numerosi errori mentre cerca il simbolo inesistente.
- Attivare SYMOPT_NO_UNQUALIFIED_LOADS usando .symopt+0x100.
- Ripetere il passaggio 2. Il debugger deve cercare solo i moduli caricati per il simbolo inesistente e dovrebbe completare l'attività molto più velocemente.
- Per disabilitare SYMOPT_DEBUG, usare .symopt-0x80000000 o il comando di estensione del debugger con estensione ! sym quiet .
Sono disponibili diverse opzioni per controllare il modo in cui il debugger carica e usa i simboli. Per un elenco completo delle opzioni dei simboli e come usarli, vedere "Impostazione delle opzioni dei simboli" nella documentazione online fornita con Gli strumenti di debug per Windows. La versione più recente del pacchetto Debug Tools for Windows è disponibile come download gratuito dal Web oppure è possibile installare il pacchetto da Windows DDK, Platform SDK o Customer Support Diagnostics CD.
Come si deve procedere?
- Per velocizzare la ricerca dei simboli, usare nomi qualificati nei punti di interruzione e nei comandi del debugger ogni volta che è possibile. Se si vuole visualizzare un simbolo da un modulo noto, qualificarlo con il nome del modulo; se non si conosce dove si trova il simbolo, usare un nome non qualificato. Per le variabili locali e gli argomenti della funzione, usare $ come nome del modulo ,ad esempio $! MyVar).
- Per diagnosticare le cause del caricamento lento dei simboli, attivare il caricamento di simboli rumorosi (SYMOPT_DEBUG) usando l'opzione -n della riga di comando o, se il debugger è già in esecuzione, usando .symopt+0x80000000 o il comando di estensione del debugger rumoroso !sym .
- Per impedire al debugger di cercare simboli nei moduli non caricati, attivare SYMOPT_NO_UNQUALIFIED_LOADS usando l'opzione della riga di comando -snul o, se il debugger è già in esecuzione, usando .symopt+0x100.
- Per caricare in modo esplicito i moduli necessari per la sessione di debug, usare i comandi del debugger, ad esempio il ricaricamento o ld.