Condividi tramite


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 dei programmi basati su Common Language Runtime di .NET Framework. Questo strumento utilizza l'API di debug del runtime per offrire servizi di debug. È possibile utilizzare 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 viene installato automaticamente con Visual Studio e con Windows SDK. Per eseguire lo strumento, si consiglia di utilizzare il prompt dei comandi di Visual Studio o il prompt dei comandi di Windows SDK (shell di CMD). Queste utilità consentono di eseguire facilmente lo strumento, senza dover passare alla cartella di installazione. Per ulteriori informazioni, vedere Prompt dei comandi di Visual Studio e Windows SDK.

  • Se si dispone di Visual Studio installato sul computer: nella barra delle applicazioni, fare clic su Start, fare clic su All Programs, fare clic su Visual Studio, fare clic su Visual Studio Tools e quindi su Visual Studio Command Prompt.

    In alternativa

    Se si dispone di Windows SDK installato sul computer: nella barra delle applicazioni, fare clic su Start, fare clic su All Programs, fare clic sulla cartella di Windows SDK e quindi su Command Prompt (o CMD Shell).

  • Al prompt dei comandi digitare quanto segue:

MDbg [ProgramName[arguments]] [options]

Commands

Una volta nel debugger (come indicato dal prompt mdbg>), digitare uno dei comandi descritti nella sezione successiva:

command [argomenti]

I comandi di MDbg.exe sono soggetti alla distinzione tra maiuscole e minuscole.

Comando

Oggetto di descrizione

ap[rocess] [numero]

Consente di passare a un altro processo di cui viene eseguito il debug o di stampare i processi disponibili. I numeri non corrispondono a ID di processo (PID) effettivi ma a un elenco a indice zero.

a[ttach] [pid]

Consente di eseguire la connessione a un processo o di stampare i processi disponibili.

b[reak] [ClassName.Method | Nome file:LineNo]

Consente di impostare 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 un percorso nell'origine.

  • break ~number imposta un punto di interruzione su un simbolo visualizzato recentemente con il comando x.

  • break module!ClassName.Method+IlOffset imposta un punto di interruzione in un percorso completo.

block[ingObjects]

Vengono mostrati i blocchi di monitoraggio che stanno bloccando i thread.

ca[tch] [tipoEccezione]

Determina l'interruzione dell'esecuzione del debugger in corrispondenza di tutte le eccezioni, non solo di quelle non gestite.

cl[earException]

Contrassegna l'eccezione corrente gestita in modo da poter continuare l'esecuzione. Se non si risolve la causa dell'eccezione, l'eccezione può essere rapidamente rigenerata.

conf[ig] [opzione value]

Consente di visualizzare tutte le opzioni configurabili e mostra la modalità di chiamata delle opzioni senza valori facoltativi. Se si specifica l'opzione, imposta value come opzione corrente. Attualmente sono disponibili le seguenti opzioni:

  • extpath imposta il percorso di ricerca delle estensioni quando viene utilizzato il comando load.

  • extpath+ aggiunge un percorso per il caricamento delle estensioni.

del[ete]

Consente di eliminare un punto di interruzione.

de[tach]

Consente di disconnettersi da un processo di cui viene eseguito il debug.

d[own] [frame]

Consente di spostare verso il basso lo stack frame attivo.

echo

Consente di restituire un messaggio alla console.

enableNotif[ication] typeName 0|1

Abilita (1) o disabilita (0) le notifiche personalizzate per il tipo specificato.

ex[it] [codice di uscita]

Consente di chiudere la shell di MDbg.exe e specifica, se necessario, il codice di uscita del processo.

fo[reach] [AltroComando]

Consente di eseguire un comando su tutti i thread. AltroComando corrisponde a un comando valido che viene eseguito su un singolo thread. foreach AltroComando consente di eseguire lo stesso comando su tutti i thread.

f[unceval] [-ad Num] nomeFunzione [arg ... ]

Esegue una valutazione della funzione sul thread attivo corrente in cui la funzione da valutare è nomeFunzione. Il nome della funzione deve essere completo e includere gli spazi dei nomi.

L'opzione -ad consente di specificare il dominio applicazione da utilizzare 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 utilizzato 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 consente di valutare la funzione System.Object.ToString nel dominio applicazione 0. Poiché il metodo ToString è una funzione di istanza, il primo parametro deve essere un puntatore this.

g[o]

Determina l'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]

In alternativa

? [comando]

Consente di visualizzare una descrizione di tutti i comandi o una descrizione dettagliata di un comando specificato.

ig[nore] [evento]

Determina l'interruzione dell'esecuzione 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, utilizzare questo comando per eseguire il rollback del debugger al numero di frame specificato. Sarà quindi possibile modificare lo stato del programma tramite il comando set e utilizzare il comando go per continuare.

k[ill]

Interrompe il processo attivo.

l[ist] [moduli | appdomains | assembly]

Consente di visualizzare i moduli, i domini applicazione o gli assembly caricati.

lo[ad] assemblyName

Consente di caricare un'estensione nel modo descritto di seguito. L'assembly specificato viene caricato e viene quindi effettuato un tentativo di caricamento del metodo statico LoadExtension dal tipo Microsoft.Tools.Mdbg.Extension.Extension.

log [eventType]

Impostare o visualizzare gli eventi da registrare.

mo[de] [opzione on/off]

Consente di impostare le opzioni del debugger. Utilizzare mode senza le opzioni per ottenere un elenco delle modalità di debug e delle relative impostazioni correnti.

mon[itorInfo] monitorReference

Vengono mostrate le informazioni sul blocco di monitoraggio dell'oggetto.

newo[bj] typeName [argomenti...]

Consente di creare un nuovo oggetto di tipo nomeTipo.

n[ext]

Consente di eseguire il codice e di passare alla riga successiva anche se questa include molte chiamate di funzione.

Opendump pathToDumpFile

Aprire il file dump specificato per eseguire il debug.

o[ut]

Consente di spostare il cursore alla fine della funzione corrente.

pa[th] [nomePercorso]

Cerca i file di origine nel percorso specificato se il percorso dei file binari non è disponibile.

p[rint] [var] | [-d]

Consente di stampare tutte le variabili dell'ambito (print), di stampare la variabile specificata (print var) o di stampare le variabili del debugger (print -d).

printe[xception] [-r]

Stampa l'ultima eccezione sul thread corrente. Utilizzare l'opzione ricorsiva (–r) per attraversare la proprietà InnerException sull'oggetto eccezione per ottenere informazioni sull'intera catena delle eccezioni.

pro[cessenum]

Consente di visualizzare i processi attivi.

q[uit] [codice di uscita]

Consente di chiudere la shell di MDbg.exe specificando, se necessario, il codice di uscita del processo.

re[sume] [* | [~]threadNumber]

Consente di riprendere il thread corrente o quello specificato dal parametro numeroThread.

Se si specifica * come valore del parametro numeroThread oppure se il numero di 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]]

Interrompe 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 specificato, per l'esecuzione del programma verranno utilizzati gli eventuali argomenti indicati.

Se gli eventi di caricamento classi, caricamento moduli e avvio thread vengono ignorati (come avviene per impostazione predefinita), il programma verrà interrotto in corrispondenza della prima istruzione eseguibile del thread principale.

È possibile imporre la compilazione JIT (just-in-time) del codice utilizzando uno dei tre flag seguenti:

  • -d(ebug) disabilita le ottimizzazioni. Questa è l'impostazione predefinita per MDbg.exe.

  • -o(ptimize) impone l'esecuzione del codice in modalità analoga a quanto avviene all'esterno del debugger, ma può comportare maggiori difficoltà durante il debug. Questo è il flag predefinito da utilizzare all'esterno del debugger.

  • -enc consente di attivare la funzionalità Modifica e continuazione ma comportare una richiesta di prestazioni.

Impostare variable=value

Consente di modificare il valore di qualsiasi variabile inclusa nell'ambito.

È inoltre 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 persino 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

Consente di impostare il puntatore all'istruzione (IP, Instruction Pointer) corrente nel file sulla posizione specificata. Se si specifica l'opzione -il, il numero rappresenta un offset MSIL (Microsoft 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]

Consente di spostare l'esecuzione alla funzione successiva della riga corrente oppure di passare alla riga successiva se non è disponibile un altra funzione di cui eseguire le istruzioni.

su[spend] [* | [~]threadNumber]

Consente di sospendere il thread corrente o quello specificato dal parametro numeroThread. Se si specifica il valore * per threadNumber, 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 emette il comando go. In tal caso, emettere il comando CTRL-C per passare al processo.

sy[mbol] nomeComando [valoreComando]

Specifica uno dei seguenti comandi:

  • symbol path ["value"] - Consente di visualizzare o impostare il percorso del simbolo corrente.

  • symbol addpath "value" - Consente di aggiungere al percorso del simbolo corrente.

  • symbol reload ["module"]- Consente di ricaricare tutti i simboli oppure i simboli relativi al modulo specificato.

  • symbol list [module] - Consente di visualizzare i simboli attualmente caricati per tutti i moduli oppure per quello specificato.

t[hread] [newThread] [-nick nickname]

Il comando del 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 utilizzare il parametro -nick per assegnare un nome alternativo a un thread.

  • thread -nick nomethread assegna un nome alternativo per il 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]

Consente di spostare verso l'alto lo stack frame attivo.

uwgc[handle] [var] | [address]

Consente di stampare la variabile rilevata da un handle. L'handle può essere specificato in base al nome o all'indirizzo.

when

Consente di visualizzare le istruzioni when attualmente attive.

when delete all | num [num [num …]] - Elimina l'istruzione when specificata dal numero o tutte le istruzioni when se all è specificato.

when stopReason [specific_condition] do cmd [cmd [cmd …] ] - Per il parametro stopReason è possibile specificare uno dei valori seguenti:

StepComplete, ProcessExited, ThreadCreated, BreakpointHit, ModuleLoaded, ClassLoaded, AssemblyLoaded, AssemblyUnloaded, ControlCTrapped, ExceptionThrown, UnhandledExceptionThrown, AsyncStop, AttachComplete, UserBreak, EvalComplete, EvalException, RemapOpportunityReached, NativeStop.

specific_condition può essere:

  • number - Per ThreadCreated e BreakpointHit, l'operazione viene generata solo quando viene interrotta da un ID thread/numero di punto di interruzione con lo stesso valore.

  • !]nome - Per ModuleLoaded, ClassLoaded, AssemblyLoaded, AssemblyUnloaded, ExceptionThrown e UnhandledExceptionThrown, l'operazione viene attivata solo quando il nome corrisponde al nome del parametro stopReason.

specific_condition deve essere impostato su un valore vuoto per altri valori di stopReason.

w[here] [-v] [-c depth] [threadID]

Consente di visualizzare informazioni di debug relative agli stack frame.

  • L'opzione -v consente di ottenere informazioni dettagliate su ciascun stack frame visualizzato.

  • Specificare un numero per depth se si desidera limitare il numero di frame visualizzati. Utilizzare il comando all per visualizzare tutti i frame. Il valore predefinito è 100.

  • Se si specifica il parametro IDthread, è possibile controllare il thread associato allo stack. Il valore predefinito corrisponde al solo thread corrente. Utilizzare il comando all per ottenere tutti i thread.

x [-c numSymbols] [module[!pattern]]

Vengono mostrate le funzioni che corrispondono al parametro pattern per un modulo.

Se viene specificato il parametro numSymbols, l'output verrà limitato al numero indicato. Se ! (che indica un'espressione regolare) non è specificato per pattern, vengono visualizzate tutte le funzioni. Se non si specifica un valore per modulo, verranno visualizzati tutti i moduli caricati. È possibile utilizzare simboli (~#) per impostare punti di interruzione con il comando break.

Note

Compilare l'applicazione di cui eseguire il debug utilizzando flag specifici del compilatore, che determina la generazione di simboli di debug. Per ulteriori informazioni su questi flag, fare riferimento alla documentazione fornita con il compilatore. È possibile eseguire il debug delle applicazioni ottimizzate, tuttavia alcune informazioni di debug risulteranno mancanti. Diverse variabili locali, ad esempio, non risulteranno visibili e le righe del codice sorgente non saranno corrette.

Dopo aver compilato l'applicazione, digitare mdbg al prompt dei comandi per avviare una sessione di debug, come illustrato nell'esempio che segue.

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, utilizzare i comandi e gli argomenti descritti nella sezione precedente.

Vedere anche

Riferimenti

Prompt dei comandi di Visual Studio e Windows SDK

Altre risorse

Strumenti di .NET Framework

Cronologia delle modifiche

Data

Cronologia

Motivo

Aprile 2011

Sono state aggiunte informazioni sull'utilizzo di Visual Studio e dei prompt dei comandi di Windows SDK.

Miglioramento delle informazioni.