jueves, 13 de junio de 2013

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


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 el runtime de la API de depuración para proporcionar servicios de depuración. Puede utilizar MDbg.exe para depurar solo código administrado; no hay soporte para depurar código no administrado.
Esta herramienta se instala automáticamente con Visual Studio y con el SDK de Windows. Para ejecutar la herramienta, se recomienda usar el símbolo del sistema de Visual Studio o del SDK de Windows (shell de CMD). Estas utilidades permiten ejecutar la herramienta fácilmente, sin navegar a la carpeta de instalación. Para obtener más información, vea Símbolos del sistema del SDK de Windows y Visual Studio.



  • Si tiene instalado Visual Studio en el equipo: en la barra de tareas, haga clic en StartAll ProgramsVisual Studio y Visual Studio Tools y, a continuación, haga clic en Visual Studio Command Prompt.
    O bien
    Si tiene el SDK de Windows instalado en el equipo: en la barra de tareas, haga clic en StartAll Programs, haga clic en la carpeta del SDK de Windows y, a continuación, haga clic en Command Prompt (o CMD Shell).
  • En el símbolo del sistema, escriba:
               MDbg [ProgramName[arguments]] [options]
Comandos


En el depurador (según lo indicado en el símbolo del sistema mdbg>), escriba uno de los comandos descritos en la sección siguiente:
command [argumentos]
Los comandos de MDbg.exe distinguen entre mayúsculas y minúsculas.
Command
Descripción
ap[rocess] [número]
Cambia a otro proceso depurado o imprime los procesos disponibles. Los números no son identificadores de proceso reales (PID), sino una lista indizada por 0.
a[ttach] [pid]
Adjunta a un proceso o imprime los procesos disponibles.
b[reak] [NombreClase.MétodoFileName: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 origen.
  • break ~número establece un punto de interrupción en un símbolo recientemente mostrado con el comando x.
  • break module!ClassName.Method+IlOffset establece un punto de interrupción en la ubicación completa.
block[ingObjects]
Muestra bloqueos del monitor, que son subprocesos de bloqueo.
ca[tch] [tipoExcepción]
Hace que el depurador se interrumpa en todas las excepciones, no sólo en las excepciones no controladas.
cl[earException]
Marca la excepción actual como controlada para que la ejecución pueda continuar. Si la causa de la excepción no se ha controlado, la excepción se puede provocar de nuevo rápidamente.
conf[ig] [valor de opción]
Muestra todas las opciones que se pueden configurar y cómo se invocan las opciones sin ningún valor opcional. Si se especifica la opción, establece value como la opción actual. Actualmente están disponibles las siguientes opciones:
  • extpath establece la ruta de acceso para buscar las extensiones cuando se utiliza el comando load.
  • extpath+ agrega una ruta de acceso para cargar extensiones.
del[ete]
Elimina un punto de interrupción.
de[tach]
Desasocia de un proceso depurado.
d[own] [marcos]
Mueve el marco de pila activo hacia abajo.
echo
Repite un mensaje a la consola.
enableNotif[ication]nombreTipo 0|1
Habilita (1) o deshabilita (0) notificaciones personalizadas para el tipo especificado.
ex[it] [códigoSalida]
Sale del shell de MDbg.exe y especifica opcionalmente el código de salida de proceso.
fo[reach] [otroComando]
Ejecuta un comando en todos los subprocesos. OtherCommand es un comando válido que funciona en un subproceso;foreachOtherCommand realiza el mismo comando en todos los subprocesos.
f[unceval] [-ad Num]nombreFunción [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 estar 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, prefije la variable con el módulo y el nombre de dominio de la aplicación; por ejemplo, funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef. Este comando evalúa la funciónSystem.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 encuentre un punto de interrupción, se cierre, o se produzca un evento (por ejemplo, una excepción no controlada) que haga que este se detenga.
h[elp] [comando]
O bien
[comando]
Muestra una descripción de todos los comandos o una descripción detallada de un comando especificado.
ig[nore] [evento]
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. También puede cambiar el estado del programa utilizando el comando set y continuar utilizando el comando go.
k[ill]
Detiene el proceso activo.
l[ist] [módulos |appdomains |ensamblados]
Muestra los módulos, dominios de aplicación o ensamblados cargados.
lo[adassemblyName
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.
log [tipoEvento]
Establezca o muestre los eventos que se van a registrar.
mo[de] [option on/off]
Establece las distintas opciones de depurador. Utilice mode sin opciones para obtener una lista de los modos de depuración y su configuración actual.
mon[itorInfo]monitorReference
Muestra información de bloqueo del monitor de objetos.
newo[bjtypeName[argumentos...]
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).
OpendumprutaArchivoVolcado
Abra el archivo de volcado de memoria especificado para la depuración.
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 (printvar) o imprime las variables de depurador (print-d).
printe[xception] [-r]
Imprime la última excepción del subproceso actual. Use la opción –r (recursiva) para recorrer la propiedad InnerException del objeto de excepción a fin de obtener información sobre la cadena completa de excepciones.
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 invalidan 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 el depurador para que realice una compilación Just-In-Time (JIT) del código utilizando una de las tres marcas siguientes:
  • -d ( ebug ) deshabilita las optimizaciones. Este es el valor predeterminado de MDbg.exe.
  • -o ( ptimize ) fuerza el código a ejecutarse más como lo hace fuera del depurador, pero también dificulta la experiencia de depuración. Es el valor predeterminado para usarlo fuera del depurador.
  • -enc habilita la característica Editar y continuar pero produce un impacto en el rendimiento.
Set variable=valor
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 controladores del valor original, e incluso el valor original está fuera de á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] número
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 Lenguaje intermedio de Microsoft (MSIL) en el método. De lo contrario, el número representa un número de línea de código fuente.
sh[ow] [líneas]
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. 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, presione CTRL-C para irrumpir en el proceso.
sy[mbol]nombreComando[valorComando]
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"]: recarga 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 alias]
El comando de subprocesos sin parámetros muestra todos los subprocesos administrados en el proceso actual. Los subprocesos suelen identificarse por sus números de subproceso; sin embargo, si un subproceso tiene asignado un alias, en su lugar se muestra el alias. Puede utilizar el parámetro -nick para asignar un alias a un subproceso.
  • thread -nick threadName asigna un alias al subproceso actualmente en ejecución.
Los alias no pueden ser números. Si el subproceso actual ya tiene un alias asignado, el alias anterior se reemplaza con el nuevo. Si el nuevo alias es una cadena vacía (""), el alias del subproceso actual se elimina y no se asigna ningún alias nuevo a este.
u[p]
Mueve el marco de pila activo hacia arriba.
uwgc[handle] [var] | [dirección]
Imprime la variable en la que un identificador ha realizado el seguimiento. El identificador se puede especificar por nombre o dirección.
cuando
Muestra las instrucciones when actualmente activas.
when delete all num [num [num …]]: elimina la instrucción when especificada por el número, o bien todas las instruccioneswhen si se especifica all.
when stopReason [specific_condition] docmd [cmd [cmd …] ] - El parámetro stopReason puede ser uno de los siguientes:
StepComplete ProcessExitedThreadCreatedBreakpointHitModuleLoadedClassLoadedAssemblyLoaded,AssemblyUnloadedControlCTrappedExceptionThrownUnhandledExceptionThrownAsyncStopAttachComplete,UserBreakEvalCompleteEvalExceptionRemapOpportunityReachedNativeStop.
specific_condition puede ser una de las siguientes:
  • 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.
  • [!]nombre: para ModuleLoadedClassLoadedAssemblyLoadedAssemblyUnloadedExceptionThrown yUnhandledExceptionThrown, desencadena la acción solo cuando el nombre coincide con el nombre de stopReason.
specific_condition debe estar vacío para otros valores de stopReason.
w[here] [-v] [-cdepth] [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 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 [-cnumSymbols] [module[!pattern]]
Muestra las funciones que coinciden con pattern para un módulo.
Si se especifica numSymbols, el resultado se limita al número especificado. Si ! (que indica una expresión regular) no se especifica para pattern, 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.

Compile la aplicación que se va a depurar usando marcas específicas del compilador que hacen que el compilador genere símbolos de depuración.Consulte la documentación del compilador para obtener más información acerca de estas marcas. Puede depurar aplicaciones optimizadas, pero parte de la información de depuración se perderá. Por ejemplo, muchas variables locales no serán visibles y las líneas de código fuente serán incorrectas.
Después de compilar 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 que se encuentre en el depurador, use los comandos y argumentos descritos en la sección anterior.

No hay comentarios:

Publicar un comentario