Debugger della riga di comando di .NET Framework (MDbg.exe)
Aggiornamento: novembre 2007
Il debugger della riga di comando di .NET Framework consente ai fornitori di strumenti e agli sviluppatori di applicazioni di individuare e correggere gli errori dei programmi basati su Common Language Runtime di .NET Framework. Questo strumento utilizza l'API di debug del runtime per offrire servizi di debug. Il codice sorgente di MDbg.exe viene fornito come applicazione di esempio in Windows Software Development Kit (SDK). Gli sviluppatori possono esaminare il codice per comprendere come utilizzare i servizi di debug. Al momento è 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.
MDbg [ProgramName[Program arguments]] [optional arguments ]
command [command arguments]
Comandi
Comando |
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 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 | FileName:LineNo] |
Consente di impostare un punto di interruzione in corrispondenza del metodo specificato. La scansione dei moduli viene eseguita in modo sequenziale. break FileName:LineNo consente di impostare un punto di interruzione in corrispondenza di un percorso dell'origine. break ~numero consente di impostare un punto di interruzione su un simbolo visualizzato di recente con il comando x. break modulo!ClassName.Method+IlOffset consente di impostare un punto di interruzione sul percorso completo. |
ca[tch] [tipoEccezione] |
Determina l'interruzione dell'esecuzione del debugger in corrispondenza di tutte le eccezioni, non solo di quelle non gestite. |
conf[ig] [opzione value] |
Consente di visualizzare tutte le opzioni configurabili e la modalità di chiamata delle opzioni senza valori facoltativi. Se si specifica l'opzione, imposta value come opzione corrente. Le opzioni attualmente disponibili sono: extpath: consente di impostare il percorso di ricerca delle estensioni quando viene utilizzato il comando load. extpath+: consente di aggiungere un percorso ai percorsi esistenti da cui è possibile caricare le 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. |
ex[it] [codice di uscita] |
Consente di chiudere la shell di MDbg.exe specificando, 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. Digitare 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] oppure ? [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|dominiapp|assembly] |
Consente di visualizzare i moduli, i domini applicazione o gli assembly caricati. |
lo[ad] nomeAssembly |
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. |
mo[de] [opzione on/off] |
Consente di impostare le opzioni del debugger. Il parametro opzione deve essere una coppia di due lettere. |
newo[bj] nomeTipo [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. |
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). |
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] [*|[~]numeroThread] |
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] [[percorso_exe] [arg_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 qualsiasi dei tre flag validi: -d(ebug) è il flag predefinito per MDbg.exe e consente di disattivare le ottimizzazioni. -o(ptimize) è il flag predefinito da utilizzare all'esterno del debugger. Impone l'esecuzione del codice in modalità analoga a quanto avviene all'esterno del debugger, ma può comportare maggiori difficoltà durante il debug. -enc consente di attivare la funzionalità Modifica e continuazione ma comportare una richiesta di prestazioni. |
Set 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, anche se 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 viene specificata l'opzione -il, il numero rappresenta un offset 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] [*|[~]numeroThread] |
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] [nuovoThread][-nome alternativo] |
Consente di assegnare il valore di nome come nome alternativo del thread attualmente attivo. Il nome alternativo può essere utilizzato in sostituzione del nome del thread. I nomi alternativi non possono essere numeri. Se al thread corrente è già stato assegnato un nome alternativo, quello il nome alternativo precedente verrà sostituito da quello nuovo. Se il nuovo nome alternativo è "", il nome alternativo del thread corrente verrà eliminato e non ne verrà assegnato un altro. thread nuovoThread - Consente di impostare il thread attivo su nuovoThread. nuovoThread può essere un nome alternativo o un numero di thread. thread - Consente di visualizzare tutti i thread gestiti inclusi nel processo corrente. I thread sono in genere identificati in base al relativo numero. Se tuttavia al thread è assegnato un nome alternativo, verrà visualizzato tale nome. |
u[p] |
Consente di spostare verso l'alto lo stack frame attivo. |
uwgc[handle] [var] | [indirizzo] |
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…]] - Consente di eliminare l'istruzione when specificata in base al numero oppure tutte le istruzioni when se viene specificato all. when stopReason[specific_condition] do cmd[cmd[cmd…] ] - Il valore del parametro stopReason può essere: StepComplete,ProcessExited,ThreadCreated,BreakpointHit,ModuleLoaded,ClassLoaded,AssemblyLoaded,AssemblyUnloaded,ControlCTrapped,ExceptionThrown,UnhandledExceptionThrown,AsyncStop,AttachComplete, UserBreak, EvalComplete,EvalException,RemapOpportunityReached,NativeStop. Il valore di specific_condition può essere: numero - 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] [IDthread] |
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 simboliNum] [modulo[!pattern]] |
Consente di visualizzare le funzioni corrispondenti al parametro pattern per un modulo. Se viene specificato il parametro simboliNum, l'output verrà limitato al numero indicato. Se non si specifica !regex, verranno 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. |
Nota
I comandi di MDbg.exe sono soggetti alla distinzione tra maiuscole e minuscole.
Note
Compilare l'applicazione di cui eseguire il debug utilizzando flag specifici del compilatore, che determinano 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.
Sarà quindi possibile utilizzare i comandi e gli argomenti appropriati per richiamare le necessarie funzionalità dello strumento.