Depurador de la línea de comandos de .NET Framework (MDbg.exe)

Actualización: noviembre 2007

El Depurador de la línea de comandos de .NET Framework ayuda a los proveedores de herramientas y a los programadores de aplicaciones a encontrar y corregir los errores que pueden producirse en programas orientados al Common Language Runtime de .NET Framework. Esta herramienta utiliza la API de depuración en tiempo de ejecución para proporcionar servicios de depuración. El código fuente de MDbg.exe se distribuye como una aplicación de ejemplo en Kit de desarrollo de software de Windows (SDK). Los programadores pueden examinar el código para aprender a utilizar los servicios de depuración. Actualmente sólo se puede utilizar MDbg.exe para depurar código administrado, ya que no se puede depurar código no administrado.

MDbg [ProgramName[Program arguments]] [optional arguments ]
command [command arguments]

Comandos

Comando

Descripción

ap[rocess] [number]

Cambia a otro proceso depurado o imprime los procesos disponibles. Los números no son PIDs reales, sino una lista indizada por 0.

a[ttach] [pid]

Asocia a un proceso o imprime los procesos disponibles.

b[reak] [ClassName.Method | FileName:LineNo]

Establece un punto de interrupción en el método especificado. Los módulos se examinan secuencialmente. break FileName:LineNo establece un punto de interrupción en una ubicación del código fuente. break ~number establece un punto de interrupción en un símbolo que se ha mostrado recientemente con el comando x. break module!ClassName.Method+IlOffset establece un punto de interrupción en la ubicación completa.

ca[tch] [exceptionType]

Hace que el depurador interrumpa todas las excepciones, no sólo las excepciones no controladas.

conf[ig] [option value]

Muestra todas las opciones configurables y cómo se invocan estas opciones sin ningún valor opcional. Si se especifica la opción, establece value como la opción actual.

Las opciones actualmente disponibles son:

extpath: Establece la ruta de acceso donde se buscan las extensiones cuando se utiliza el comando load.

extpath+: Agrega una ruta de acceso a las rutas de acceso existentes de donde se pueden cargar las extensiones.

del[ete]

Elimina un punto de interrupción.

de[tach]

Desasocia de un proceso depurado.

d[own] [frames]

Mueve el marco de pila activo hacia abajo.

echo

Repite un mensaje a la consola.

ex[it] [exitcode]

Sale del shell de MDbg.exe, especificando opcionalmente el código de salida de proceso.

fo[reach] [OtherCommand]

Realiza un comando en todos los subprocesos. OtherCommand es un comando válido que funciona en un subproceso; foreach OtherCommand realiza el mismo comando en todos los subprocesos.

f[unceval] [-ad Num] functionName [args... ]

Realiza una evaluación de función en el subproceso activo actual donde la función que se va a evaluar es functionName. El nombre de la función debe ser completo, incluso los espacios de nombres.

La opción -ad especifica el dominio de aplicación que se utiliza para resolver la función. Si no se especifica la opción -ad, el dominio de la aplicación para la resolución establece su valor predeterminado en el dominio de la aplicación donde está ubicado el subproceso utilizado para la evaluación de la función.

Si la función que se evalúa no es estática, el primer parámetro pasado debería ser un puntero this. En todos los dominios de aplicación se buscan argumentos a la evaluación de función.

Para solicitar un valor de un dominio de aplicación, incluya un prefijo en la variable con el módulo y el nombre de dominio de aplicación. Por ejemplo, funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef.

Este comando evalúa la función System.Object.ToString en 0 del dominio de aplicación. Dado que el método ToString es una función de instancia, el primer parámetro debe ser un puntero this.

g[o]

Hace que el programa continúe hasta que encuentra un punto de interrupción, el programa sale o un evento hace que el programa se detenga (por ejemplo, una excepción no controlada).

h[elp] [command]

o

? [command]

Muestra una descripción de todos los comandos o una descripción detallada de un comando especificado.

ig[nore] [event]

Hace que el depurador sólo se detenga en excepciones no controladas.

int[ercept] FrameNumber

Deshace el depurador hasta un número de marco especificado.

Si el depurador encuentra una excepción, utilice este comando para deshacer el depurador hasta el número de marco especificado. Puede cambiar el estado del programa mediante el comando set y seguir utilizando el comando go.

k[ill]

Detiene el proceso activo.

l[ist] [modules|appdomains|assemblies]

Muestra los módulos, dominios de aplicación o ensamblados cargados.

lo[ad] assemblyName

Carga una extensión de la forma siguiente: se carga el ensamblado especificado y se intenta entonces ejecutar el método estático LoadExtension del tipo Microsoft.Tools.Mdbg.Extension.Extension.

mo[de] [option on/off]

Establece las distintas opciones de depurador. El parámetro option debería tener dos letras.

newo[bj] typeName [arguments...]

Crea un nuevo objeto de tipo typeName.

n[ext]

Ejecuta el código y se desplaza a la línea siguiente (incluso cuando la línea siguiente incluye muchas llamadas a las funciones).

o[ut]

Se desplaza al final de la función actual.

pa[th] [pathName]

Busca los archivos de código fuente en la ruta de acceso especificada si la ubicación en los binarios no está disponible.

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

Imprime todas las variables del ámbito (print), imprime la variable especificada (print var) o imprime las variables de depurador (print -d).

pro[cessenum]

Muestra los procesos activos.

q[uit] [exitcode]

Sale del shell de MDbg.exe, especificando opcionalmente el código de salida de proceso.

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

Reanuda el subproceso actual o el subproceso especificado por el parámetro threadNumber.

Si el parámetro threadNumber se especifica como * o si el número de subproceso comienza con ~, el comando se aplica a todos los subprocesos excepto al especificado por threadNumber.

La reanudación de un subproceso no suspendido no tiene ningún efecto.

r[un] [-d(ebug) | -o(ptimize) | -enc] [[path_to_exe] [args_to_exe]]

Interrumpe el proceso actual (si hay alguno) e inicia uno nuevo. Si no se pasa ningún argumento ejecutable, este comando ejecuta el programa que se ejecutó previamente con el comando run. Si se proporciona el argumento ejecutable, se ejecuta el programa especificado, utilizando los argumentos opcionalmente proporcionados.

Si se omiten los eventos de carga de clases, de carga de módulos y de inicio de subprocesos (son la opción predeterminada), el programa se detiene en la primera instrucción ejecutable del subproceso principal.

Puede forzar al depurador a compilar just-in-time (JIT) el código utilizando cualquiera de los tres

marcadores válidos:

-d(ebug) es el valor predeterminado para MDbg.exe y deshabilita las optimizaciones.

-o(ptimize) es el valor predeterminado para el uso fuera del depurador. Fuerza al código a ejecutarse más fuera del depurador, pero también dificulta la experiencia de depuración.

-enc habilita la característica Editar y Continuar pero produce un impacto en el rendimiento.

Set variable=value

Cambia el valor de cualquier variable en el ámbito.

También puede crear sus propias variables de depurador y asignarles valores de referencia desde la aplicación. Estos valores actúan como identificadores al valor original, aunque el valor original esté fuera del ámbito. Todas las variables de depurador deben comenzar con $ (por ejemplo, $var). Borre estos identificadores estableciéndolos en un valor vacío mediante el comando siguiente: set $var=

Setip [-il] number

Establece el puntero de instrucciones (IP) actual en el archivo en la posición especificada. Si se especifica la opción -il, el número representa un desplazamiento del idioma intermedio en el método. De lo contrario el número representa un número de línea de código fuente.

sh[ow] [lines]

Especifica el número de líneas que se van a mostrar.

s[tep]

Pasa la ejecución a la función siguiente en la línea actual o se desplaza a la línea siguiente si no hay ninguna función para ir.

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

Suspende el subproceso actual o el subproceso especificado por el parámetro threadNumber. If

Si threadNumber se especifica como *, el comando se aplica a todos los subprocesos. Si el número del subproceso se inicia con ~, el comando se aplica a todos los subprocesos excepto al especificado por threadNumber. Los subprocesos suspendidos se excluyen de la ejecución cuando el proceso se ejecuta por el comando go o step. Si no hay ningún subproceso no suspendido en el proceso y emite el comando go, el proceso no continuará. En ese caso, emita el comando CTRL-C para interrumpir la ejecución del proceso.

sy[mbol] commandName [commandValue]

Especifique uno de los siguientes comandos:

symbol path ["value"]: muestra o establece la ruta de acceso del símbolo actual.

symbol addpath "value": agrega a la ruta de acceso del símbolo actual.

symbol reload ["module"]: vuelve a cargar todos los símbolos o los símbolos para el módulo especificado.

symbol list [module]: muestra los símbolos actualmente cargados para todos los módulos o para el módulo especificado.

t[hread] [newThread][-nick name]

Asigna name como sobrenombre al subproceso actualmente activo. El sobrenombre se puede utilizar en lugar del nombre del subproceso. Los sobrenombres no pueden ser números. Si el subproceso actual ya tiene un sobrenombre asignado, el sobrenombre anterior se reemplaza con el nuevo. Si el nuevo sobrenombre es "", se elimina el sobrenombre en el subproceso actual y no se asigna ningún sobrenombre nuevo al subproceso.

thread newThread: establece el subproceso activo en newThread. newThread puede ser un sobrenombre del subproceso o un número del subproceso.

thread: muestra todos los subprocesos administrados en el proceso actual.

Los subprocesos por lo general se identifican por su número de subproceso; sin embargo, si el subproceso tiene un sobrenombre asignado, se muestra el sobrenombre en su lugar.

u[p]

Mueve el marco de pila activo hacia arriba.

uwgc[handle] [var] | [address]

Imprime la variable en la que un identificador ha realizado el seguimiento. El identificador se puede especificar por nombre o dirección.

when

Muestra las instrucciones when actualmente activas.

when delete all |num[num[num…]]: elimina la instrucción when especificada por el número, o todas las instrucciones when si se especifica all.

when stopReason[specific_condition] do cmd[cmd[cmd…] ] - El parámetro stopReason puede ser:

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

specific_condition puede ser:

number: para ThreadCreated y BreakpointHit, desencadena la acción sólo cuando se detiene por un número de identificador de subproceso o de punto de interrupción con mismo valor.

[!]name: para ModuleLoaded, ClassLoaded, AssemblyLoaded, AssemblyUnloaded, ExceptionThrown y UnhandledExceptionThrown, desencadena la acción sólo cuando el nombre coincide con el nombre de stopReason.

specific_condition debe estar vacío para otros valores de stopReason.

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

Muestra información de depuración sobre los marcos de pila.

La opción -v proporciona la información detallada sobre cada marco de pila mostrado.

La especificación de un número para depth limita el número de marcos que se muestran. Utilice el comando all el comando para mostrar todos los marcos. El valor predeterminado es 100.

Si especifica el parámetro threadID, puede controlar qué subproceso se asocia a la pila. El valor predeterminado es únicamente el subproceso actual. Utilice el comando all para obtener todos los subprocesos.

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

Muestra las funciones que coinciden con el pattern para un módulo.

Si se especifica numSymbols, el resultado se limita al número especificado. Si no se especifica !regex, se muestran todas las funciones. Si no se proporciona module, se muestran todos los módulos cargados. Se pueden utilizar símbolos (~ #) para establecer puntos de interrupción mediante el comando break.

Nota

Los comandos de MDbg.exe distinguen entre mayúsculas y minúsculas.

Comentarios

Compile la aplicación objeto de depuración utilizando marcadores específicos de compiladores, que permiten al compilador generar símbolos de depuración. Consulte la documentación del compilador para obtener más información acerca de estos marcadores. Podrá continuar depurando las aplicaciones optimizadas, pero perderá parte de la información de depuración. Por ejemplo, muchas variables locales no serán visibles y las líneas de código fuente serán incorrectas.

Una vez compilada la aplicación, escriba MDbg en el símbolo del sistema para iniciar una sesión de depuración, como se muestra en el ejemplo siguiente.

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>

El símbolo del sistema mdbg indica que se está en el depurador.

Una vez situado en el depurador, utilice los comandos y argumentos apropiados para invocar la funcionalidad requerida.

Vea también

Referencia

Herramientas de .NET Framework

Símbolo del sistema de SDK