MDbg.exe (Debugger della riga di comando di .NET Framework)
Il debugger della riga di comando di .NET Framework consente ai fornitori di strumenti e agli sviluppatori di applicazioni di individuare e correggere i bug nei programmi destinati a Common Language Runtime di .NET Framework. Questo strumento usa l'API di debug del runtime per offrire servizi di debug. È possibile usare MDbg.exe solo per eseguire il debug di codice gestito in quanto non esiste alcun supporto per il debug di codice non gestito.
Questo strumento è disponibile tramite NuGet. Per informazioni sull'installazione, vedere MDbg 0.1.0. Per eseguire lo strumento, usare la console di Gestione pacchetti. Per altre informazioni su come usare la console di Gestione pacchetti, vedere l'articolo Console di Gestione pacchetti.
Al prompt di Gestione pacchetti, digitare quanto segue:
Sintassi
MDbg [ProgramName[arguments]] [options]
Comandi
Quando si è nel debugger (come indicato dal prompt di mdbg> ), digitare uno dei comandi descritti nella sezione successiva:
comando [argomenti]
I comandi di MDbg.exe sono soggetti alla distinzione tra maiuscole e minuscole.
Comando | Descrizione |
---|---|
ap[rocess] [numero] | Passa a un altro processo di cui viene eseguito il debug o visualizza i processi disponibili. I numeri non corrispondono a ID di processo (PID) effettivi ma a un elenco a indice zero. |
a[ttach] [pid] | Esegue la connessione a un processo o visualizza i processi disponibili. |
b[reak] [ClassName.Method | FileName:LineNo] | Imposta un punto di interruzione in corrispondenza del metodo specificato. I moduli vengono sottoposti a scansione in sequenza. - break FileName:LineNo imposta un punto di interruzione in una posizione nell'origine. - break ~number imposta un punto di interruzione su un simbolo visualizzato di recente con il comando x . - modulo di interruzione! ClassName.Method+IlOffset imposta un punto di interruzione nella posizione completa. |
block[ingObjects] | Visualizza i blocchi di monitoraggio che stanno bloccando i thread. |
ca[tch] [tipoEccezione] | Determina l'arresto del debugger in corrispondenza di tutte le eccezioni, non solo di quelle non gestite. |
cl[earException] | Contrassegna l'eccezione corrente come gestita in modo che l'esecuzione continui. Se non si risolve la causa dell'eccezione, questa potrebbe essere nuovamente generata in breve tempo. |
conf[ig] [valoreopzione] | Visualizza tutte le opzioni configurabili e mostra come richiamare le opzioni senza valori facoltativi. Se si specifica l'opzione, imposta value come opzione corrente. Attualmente sono disponibili le seguenti opzioni:- extpath imposta il percorso per la ricerca delle estensioni quando viene usato il comando load .- extpath+ aggiunge un percorso per caricare le estensioni. |
del[ete] | Elimina un punto di interruzione. |
de[tach] | Esegue la disconnessione da un processo sottoposto a debug. |
d[own] [frame] | Sposta verso il basso lo stack frame attivo. |
echo | Restituisce un messaggio alla console. |
enableNotif[ication] typeName 0|1 | Abilita (1) o disabilita (0) le notifiche personalizzate per il tipo specificato. |
ex[it] [codiceuscita] | Esce dalla shell di MDbg.exe e specifica, facoltativamente, il codice di uscita del processo. |
fo[reach] [AltroComando] | Esegue un comando su tutti i thread. OtherCommand è un comando valido che opera su un thread; foreach OtherCommand esegue lo stesso comando in tutti i thread. |
f[unceval] [-ad Num] functionName [args ... ] |
Esegue una valutazione della funzione sul thread attivo corrente specificata da nomeFunzione. Il nome della funzione deve essere completo e includere gli spazi dei nomi. L'opzione -ad specifica il dominio applicazione da usare per risolvere la funzione. Se l'opzione -ad non viene specificata, per impostazione predefinita, il dominio applicazione per la risoluzione corrisponde a quello in cui è reperibile il thread usato per la valutazione della funzione.Se la funzione da valutare non è statica, il primo parametro passato deve essere un puntatore this . La ricerca degli argomenti per la valutazione della funzione viene eseguita in tutti i domini applicazione.Per richiedere un valore di un dominio applicazione, anteporre alla variabile il nome del modulo e del dominio applicazione, ad esempio funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef . Questo comando valuta la funzione System.Object.ToString nel dominio applicazione 0 . Dato che il metodo ToString è una funzione di istanza, il primo parametro deve essere un puntatore this . |
g[o] | Determina la continuazione dell'esecuzione del programma fino a quando non viene rilevato un punto di interruzione, il programma non viene chiuso o un evento, ad esempio un'eccezione non gestita, non causa la chiusura del programma. |
h[elp] [comando] oppure ? [comando] |
Visualizza una descrizione di tutti i comandi o una descrizione dettagliata di un comando specificato. |
ig[nore] [evento] | Determina l'arresto del debugger solo in corrispondenza di eccezioni non gestite. |
int[ercept] NumeroFrame | Esegue il rollback del debugger a un numero di frame specificato. Se il debugger rileva un'eccezione, usare questo comando per eseguire il rollback del debugger al numero di frame specificato. È possibile modificare lo stato del programma tramite il comando set e usare il comando go per continuare. |
k[ill] | Arresta il processo attivo. |
l[ist] [moduli | assembly di appdomains] | | Visualizza i moduli, i domini applicazione o gli assembly caricati. |
lo[ad] nomeAssembly | Carica un'estensione in questo modo: l'assembly specificato viene caricato e viene quindi effettuato un tentativo di eseguire il metodo statico LoadExtension dal tipo Microsoft.Tools.Mdbg.Extension.Extension . |
log [tipoEvento] | Imposta o visualizza gli eventi da registrare. |
mo[de] [opzione on/off] | Imposta opzioni differenti del debugger. Usare mode senza opzioni per ottenere un elenco delle modalità di debug e delle relative impostazioni correnti. |
mon[itorInfo] riferimentoMonitoraggio | Visualizza le informazioni sul blocco di monitoraggio degli oggetti. |
newo[bj] nomeTipo [argomenti...] | Crea un nuovo oggetto di tipo nomeTipo. |
n[ext] | Esegue il codice e passa alla riga successiva anche se questa include molte chiamate di funzione. |
Opendump pathToDumpFile | Apre il file dump specificato per il debug. |
o[ut] | Esegue lo spostamento alla fine della funzione corrente. |
pa[th] [nomePercorso] | Cerca i file di origine nel percorso specificato se il percorso non è disponibile nei binari. |
p[rint] [var] | [-d ] |
Stampa tutte le variabili nell'ambito (stampa), stampa la variabile specificata (var di stampa) o stampa le variabili del debugger (stampa-d ). |
printe[xception] [-r] | Visualizza l'ultima eccezione sul thread corrente. Usare l'opzione di ricorsione –r per attraversare la proprietà InnerException sull'oggetto eccezione per ottenere informazioni sull'intera catena delle eccezioni. |
pro[cessenum] | Visualizza i processi attivi. |
q[uit] [codiceUscita] | Esce dalla shell di MDbg.exe specificando, facoltativamente, il codice di uscita del processo. |
re[sume] [* | [~ ]threadNumber] |
Riprende il thread corrente o quello specificato dal parametro numeroThread. Se il parametro numeroThread viene specificato come * o se il numero del thread inizia con ~ , il comando viene applicato a tutti i thread ad eccezione di quello specificato da numeroThread.La ripresa di un thread non sospeso non produce alcun effetto. |
r[un] [-d (ebug ) | -o (ptimize ) |-enc ] [[path_to_exe] [args_to_exe]] |
Arresta l'eventuale processo corrente e ne avvia uno nuovo. Se non viene passato alcun argomento eseguibile, verrà eseguito l'ultimo programma eseguito con il comando run . Se l'argomento eseguibile viene fornito, per l'esecuzione del programma specificato verranno usati gli argomenti facoltativamente indicati.Se gli eventi di caricamento classi, caricamento moduli e avvio thread vengono ignorati (come avviene per impostazione predefinita), il programma verrà arrestato in corrispondenza della prima istruzione eseguibile del thread principale. È possibile forzare la compilazione JIT (just-in-time) del codice usando uno dei tre flag seguenti: - -d ( ebug ) disabilita le ottimizzazioni. Questa è l'impostazione predefinita per MDbg.exe.- -o ( ptimize ) forza l'esecuzione del codice in modo più simile all'esterno del debugger, ma rende anche più difficile l'esperienza di debug. Questo è il flag predefinito da usare all'esterno del debugger.- -enc abilita la funzionalità Modifica e continuazione ma comporta una riduzione delle prestazioni. |
Impostare il valore della variabile= | Modifica il valore di qualsiasi variabile inclusa nell'ambito. È anche possibile creare variabili personalizzate per il debugger e assegnarvi valori di riferimento dall'interno dell'applicazione. Questi valori fungono da handle del valore originale e anche quest'ultimo non è incluso nell'ambito. Tutte le variabili del debugger devono iniziare con $ , ad esempio $var . Per cancellare questi handle, impostarli su un valore vuoto tramite il comando seguente:set $var= |
Setip [-il ] numero |
Imposta il puntatore all'istruzione (IP, Instruction Pointer) corrente nel file sulla posizione specificata. Se si specifica l'opzione -il , il numero rappresenta un offset CIL (Common Intermediate Language) nel metodo . In caso contrario, il numero rappresenta un numero di riga del codice sorgente. |
sh[ow] [righe] | Specifica il numero di righe da visualizzare. |
s[tep] | Sposta l'esecuzione alla funzione successiva della riga corrente oppure passa alla riga successiva se non è disponibile un'altra funzione di cui eseguire le istruzioni. |
su[spend] [* | [~]threadNumber] | Sospende il thread corrente o quello specificato dal parametro numeroThread. Se numeroThread viene specificato come * , il comando viene applicato a tutti i thread. Se il numero di thread inizia con ~ , il comando viene applicato a tutti i thread, ad eccezione di quello specificato da numeroThread. I thread sospesi sono esclusi dall'esecuzione quando il processo viene eseguito tramite il comando go o step. L'esecuzione del processo non continuerà se il processo non include thread non sospesi e si usa il comando go. In tal caso, premere CTRL-C per passare al processo. |
sy[mbol] nomeComando [valoreComando] | Specifica uno dei seguenti comandi: - symbol path ["value" ] - Visualizza o imposta il percorso del simbolo corrente.- symbol addpath "value" - Aggiunge al percorso del simbolo corrente.- symbol reload ["module" ] - Ricarica tutti i simboli o i simboli per il modulo specificato.- symbol list [module ] - Visualizza tutti i simboli attualmente caricati per tutti i moduli o per il modulo specificato. |
t[hread] [nuovoThread] [-soprannome] |
Il comando thread senza parametri visualizza tutti i thread gestiti nel processo corrente. I thread sono in genere identificati in base ai relativi numeri. Se tuttavia al thread è assegnato un nome alternativo, verrà visualizzato tale nome. È possibile usare il parametro -nick per assegnare un nome alternativo a un thread.- threadName -nick thread assegna un nome alternativo al thread attualmente in esecuzione.I nomi alternativi non possono essere numeri. Se al thread corrente è già stato assegnato un nome alternativo, il nome alternativo precedente verrà sostituito da quello nuovo. Se il nuovo nome alternativo è una stringa vuota (""), il nome alternativo del thread corrente verrà eliminato e non ne verrà assegnato un altro. |
u[p] | Spostare verso l'alto lo stack frame attivo. |
uwgc[handle] [var] | [indirizzo] | Visualizza la variabile rilevata da un handle. L'handle può essere specificato in base al nome o all'indirizzo. |
when | Visualizza le istruzioni when attualmente attive.quando si elimina tutto num | [ [num num ...]] - Elimina l'istruzione when specificata dal numero o tutte le when istruzioni se all è specificato.quando stopReason [specific_condition ] farecmd [ [cmd cmd ...] ] - Il parametro stopReason può essere uno dei seguenti:StepComplete , ProcessExited , BreakpointHit , , ModuleLoaded ClassLoaded , EvalComplete . AssemblyLoaded NativeStop EvalException UserBreak AssemblyUnloaded ExceptionThrown RemapOpportunityReached ControlCTrapped UnhandledExceptionThrown AsyncStop AttachComplete ThreadCreated condizione_specifica può accettare uno dei seguenti valori: - numero - Per ThreadCreated e BreakpointHit , attiva l'azione solo quando arrestata da un numero ID thread/punto di interruzione con lo stesso valore.- [ ! ]nome - Per ModuleLoaded , ClassLoaded , AssemblyLoaded , AssemblyUnloaded , ExceptionThrown e UnhandledExceptionThrown , attiva l'operazione solo quando il nome corrisponde al nome di motivoInterruzione.condizione_specifica deve essere vuoto per gli altri valori di motivoInterruzione. |
w[here] [-v ] [-c depth] [threadID] |
Visualizza informazioni di debug relative agli stack frame. - L'opzione -v offre informazioni dettagliate su ogni stack frame visualizzato.- Specificando un numero per depth , limita il numero di frame visualizzati. Usare il comando all per visualizzare tutti i frame. L'impostazione predefinita è 100.Se si specifica il parametro IDthread, è possibile determinare quale thread è associato allo stack. Il valore predefinito è il solo thread corrente. Usare il comando all per ottenere tutti i thread. |
x [-c numeroSimboli] [modulo[! modello]] |
Visualizza le funzioni che corrispondono al parametro pattern per un modulo.Se viene specificato il parametro numeroSimboli, l'output viene limitato al numero indicato. Se non viene specificato ! (che indica un'espressione regolare) per il parametro modello, vengono visualizzate tutte le funzioni. Se non viene specificato un valore per il parametro modulo, vengono visualizzati tutti i moduli caricati. È possibile usare simboli (~#) per impostare punti di interruzione tramite il comando break. |
Osservazioni:
Compilare l'applicazione di cui eseguire il debug usando flag specifici del compilatore che determinano la generazione di simboli di debug da parte del compilatore. Per altre informazioni su questi flag, vedere la documentazione fornita con il compilatore. È possibile eseguire il debug delle applicazioni ottimizzate, tuttavia alcune informazioni di debug risulteranno mancanti. Molte variabili locali, ad esempio, non risulteranno visibili e le righe del codice sorgente non saranno accurate.
Dopo aver compilato l'applicazione, digitare mdbg al prompt dei comandi per avviare una sessione di debug, come illustrato nell'esempio seguente.
C:\Program Files\Microsoft Visual Studio 8\VC>mdbg
MDbg (Managed debugger) v2.0.50727.42 (RTM.050727-4200) started.
Copyright (C) Microsoft Corporation. All rights reserved.
For information about commands type "help";
to exit program type "quit".
mdbg>
Il prompt mdbg>
indica che il debugger è in esecuzione.
Una volta nel debugger, usare i comandi e gli argomenti descritti nella sezione precedente.