Depurador en tiempo de ejecución (Cordbg.exe)
Actualización: noviembre 2007
El Depurador en tiempo de ejecución ayuda a los proveedores de herramientas y a los desarrolladores de aplicaciones a encontrar y corregir los errores que pueden producirse en programas orientados a 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 para Cordbg.exe se incluye como una aplicación de ejemplo. Los programadores pueden examinar el código para aprender a utilizar los servicios de depuración. Actualmente sólo se puede utilizar Cordbg.exe para depurar código administrado, ya que no se puede depurar código no administrado.
Utilice la primera línea de sintaxis que aparece a continuación, , para iniciar una sesión de Cordbg.exe. Utilice la segunda línea en la línea de comandos de (cordbg) dentro de una sesión de Cordbg.exe.
cordbg [ProgramName[Program arguments]][optional arguments ]
command [command arguments]
Parámetros
Comando |
Descripción |
---|---|
ap[pdomainenum] [option] |
Enumera todos los módulos, ensamblados y dominios de la aplicación en el proceso actual. Si no se especifica el argumento option, el comando enumera todos los módulos, ensamblados y dominios de la aplicación en el proceso actual. Después de realizar la acción de desasociar o asociar, se debe especificar el comando go para reanudar la ejecución. El argumento option puede tener uno de los valores siguientes:
|
as[sociatesource] {s|b breakpoint id} filename |
Asocia el nombre de archivo dado al puntero del marco de pila actual (opción s) o al punto de interrupción especificado (opción b). |
a[ttach] pid |
Asocia el depurador a un proceso en ejecución. Cordbg.exe cierra el programa que se está depurando actualmente (si hay alguno) e intenta realizar la asociación al proceso especificado por el argumento pid. El número de identificación del proceso pid puede expresarse en formato decimal o hexadecimal. |
b[reak] [[file:] line number] | [[ class::] function [:offset]] |
Establece o muestra puntos de interrupción. Si no se especifican argumentos, la herramienta muestra una lista de los puntos de interrupción actuales; en su defecto, establece un punto de interrupción en la ubicación especificada. Se puede establecer un punto de interrupción en las ubicaciones siguientes: un número de línea del archivo de código fuente actual, un número de línea de un archivo de código fuente completo o un método cualificado por una clase y un desplazamiento opcional con respecto a la primera línea del método. Los puntos de interrupción se mantienen durante las ejecuciones de una sesión. Se puede utilizar el comando stop del mismo modo que se utiliza el comando break. Cordbg.exe muestra puntos de interrupción "sin enlazar" si la ubicación especificada del punto de interrupción no se puede enlazar con el código. Cuando un punto de interrupción está sin enlazar, ello significa que el código subyacente correspondiente a la ubicación del punto de interrupción no se ha cargado todavía. Esto puede suceder por una serie de razones válidas, como un nombre de archivo o de clase mal escrito (estos nombres distinguen mayúsculas de minúsculas). Asimismo, los puntos de interrupción estarán sin enlazar si se establecen antes de ejecutar una aplicación. Los puntos de interrupción se enlazan cuando se carga el código verdadero. El depurador intenta volver a enlazar automáticamente los puntos de interrupción sin enlazar cuando carga un módulo. |
ca[tch] [event] |
Muestra una lista de tipos de eventos, o hace que el tipo de evento especificado detenga el depurador. Si no se especifica un argumento, la herramienta muestra una lista de tipos de eventos, donde los tipos de eventos que detienen el depurador están marcados con "on" y los tipos de eventos que se omiten están marcados con "off". Si se especifica un argumento, el depurador se detiene cuando se producen eventos del tipo especificado. De forma predeterminada, el depurador sólo se detiene en eventos de excepciones no controladas (es decir, excepciones objeto de una segunda oportunidad). Los tipos de eventos que detienen el depurador se mantienen durante las ejecuciones de una sesión. Para que el depurador omita un tipo de evento específico se debe utilizar el comando ignore. El argumento de evento puede ser uno de los siguientes:
|
conn[ect] machine_nameport |
Para los proyectos de dispositivos inteligentes. Se conecta a un dispositivo remoto que ejecuta una aplicación de .NET Compact Framework.
ParámetroDefinición
machine_nameObligatorio. Nombre o dirección IP del equipo remoto.
PuertoObligatorio. Puerto utilizado para la conexión con el equipo remoto.
|
cont [count] |
Continúa el programa. Si no se especifica un argumento, el programa continúa una vez. Si se especifica un argumento, el programa continúa el número de veces que se haya determinado. Este comando es útil para continuar un programa cuando un evento de carga de clases, una excepción o un punto de interrupción detienen el depurador. Se puede utilizar el comando go del mismo modo que se utiliza el comando cont. |
del[ete] [breakpoint id, ...] |
Elimina puntos de interrupción. Si no se especifican argumentos, la herramienta elimina todos los puntos de interrupción actuales. Si se especifican uno o varios argumentos breakpoint id, la herramienta elimina los puntos de interrupción especificados. Se pueden obtener identificadores de puntos de interrupción utilizando los comandos break o stop. Se puede utilizar el comando remove del mismo modo que se utiliza el comando delete. |
de[tach] |
Desasocia el depurador del proceso actual. El proceso se ejecuta automáticamente y continúa como si no tuviera un depurador asociado. |
dis[assemble] [0xaddress][{+|-} delta] [line count] |
Muestra instrucciones desensambladas nativas para el argumento address o el puntero de la instrucción actual, en caso de que se haya especificado. El número predeterminado de instrucciones que se muestran es cinco. Si se especifica un argumento line count, la herramienta muestra el número especificado de instrucciones adicionales anterior y posterior a la dirección o puntero de la instrucción actual. El último argumento line count utilizado es el valor predeterminado para la sesión actual. Si se especifica un argumento delta, el número que se determine se agregará a la dirección especificada o al puntero de la instrucción actual para empezar el desensamblado. |
d[own] [count] |
Desplaza hacia abajo el puntero del marco de pila para poder inspeccionar todos los marcos invocados por el proceso actual. Si no se especifica un argumento, el puntero del marco de pila se desplaza un marco hacia abajo. Si se especifica un argumento, el puntero del marco de pila se desplaza hacia abajo el número especificado de marcos. Si existe información del nivel de código fuente, la herramienta presenta la línea de código fuente del marco. Este comando se usa frecuentemente con el comando up. |
du[mp] address [count] |
Vuelca un bloque de memoria, con la salida en formato hexadecimal o decimal dependiendo del modo del depurador (vea mode). El argumento address corresponde a la dirección del bloque de memoria. El argumento count es el número de bytes que se vuelcan. |
ex[it] |
Detiene el proceso actual y cierra el depurador. Se puede utilizar el comando quit del mismo modo que se utiliza el comando exit. |
f[unceval] [class::] function [ arg0 arg1 ...argn] |
Evalúa la función especificada en el subproceso actual. La herramienta almacena el objeto nuevo en la variable $result y puede utilizarlo en evaluaciones posteriores. Los argumentos válidos están limitados a otras variables, enteros de 4 bytes y las constantes Null, True y False.
Nota:
En el caso de una función miembro, el primer argumento debe ser un objeto de la clase o clase derivada a la que pertenece la función miembro.
|
g[o] [count] |
Vea cont. |
h[elp] [command ...] |
Muestra las descripciones correspondientes a los comandos especificados. Si no se especifican argumentos, Cordbg.exe muestra una lista de comandos del depurador. Se puede utilizar el comando ? del mismo modo que se utiliza el comando help. |
ig[nore] [event] |
Muestra una lista de tipos de eventos o hace que el depurador omita el tipo de evento especificado. Si no se especifica un argumento event, la herramienta muestra una lista de tipos de eventos, donde los tipos de eventos que detienen el depurador están marcados con "on" y los tipos de eventos que se omiten están marcados con "off". Si se especifica un argumento, la herramienta omite los eventos del tipo especificado. Para establecer un tipo de evento que detenga el depurador, se debe utilizar el comando catch. El argumento event puede ser uno de los tipos de eventos siguientes:
|
i[n] [count] |
Vea step. |
k[ill] |
Detiene el proceso actual. El depurador permanece activo para procesar otros comandos. |
l[ist] option |
Muestra una lista de funciones globales, clases o módulos cargados. El argumento option puede tener uno de los valores siguientes:
|
m[ode] [[mode name {0|1} ] |
Establece y muestra modos del depurador para diversas funciones del mismo. Para establecer un valor, se debe especificar el argumento mode name y un 1 para "on" o un 0 para "off". Si no se especifica un argumento, la herramienta muestra una lista de los valores de modo actuales. Los modos se conservan en el Registro de Windows entre ejecuciones de Cordbg.exe. Para obtener más información, vea la tabla de argumentos mode del depurador.. |
newo[bj] class |
Crea un objeto nuevo utilizando el subproceso actual. La herramienta almacena el objeto nuevo en la variable $result y puede utilizarlo en evaluaciones posteriores. |
newobjnc class |
Crea un nuevo objeto mediante el subproceso actual, sin ejecutar un constructor del objeto. El nuevo objeto se inicializa a cero. La herramienta almacena el objeto nuevo en la variable $result y puede utilizarlo en evaluaciones posteriores. |
news[tr] string |
Crea una cadena nueva utilizando el subproceso actual. La herramienta almacena el objeto nuevo en la variable $result y puede utilizarlo en evaluaciones posteriores. |
n[ext] [count] |
Ejecuta paso a paso el programa hasta la línea de código fuente siguiente, considerando la llamada a la función como una sentencia única. Si no se especifica un argumento, la herramienta ejecuta paso a paso una línea de código fuente. Si se especifica un argumento, la herramienta ejecuta paso a paso el número de líneas especificado. Se puede utilizar el comando so del mismo modo que se utiliza el comando next. |
ns[ingle] [count] |
Ejecuta paso a paso una o más instrucciones del programa, considerando la llamada a la función como una sentencia única. Si no se especifica un argumento, la herramienta ejecuta paso a paso una instrucción. Si se especifica un argumento count, la herramienta ejecuta paso a paso el número de instrucciones especificado. |
o[ut] [count] |
Ejecuta el programa paso a paso hasta que se produce la salida de la función actual. Si no se especifica un argumento, la herramienta ejecuta un solo paso. Si se especifica un argumento, la herramienta ejecuta un paso el número de veces especificado. |
pa[th] [new path] |
Muestra o establece la ruta de acceso utilizada para buscar archivos de código fuente y símbolos de depuración. Si no se especifica un argumento, la herramienta muestra la ruta de acceso actual. Si se especifica un argumento new path, se convierte en la nueva ruta de acceso utilizada para buscar archivos de código fuente y símbolos de depuración. Esta ruta de acceso se mantiene entre sesiones en el Registro de Windows. |
p[rint] [variable name] |
Muestra una o más variables locales junto con sus valores. Si no se especifica un argumento, la herramienta muestra todas las variables locales y sus valores. Si se especifica un argumento, la herramienta muestra únicamente el valor de la variable local especificada. Para obtener información detallada, vea Utilizar el comando print en la sección Ejemplos. |
pro[cessenum] |
Enumera todos los procesos administrados y los dominios de la aplicación en cada proceso. |
q[uit] |
Vea exit. |
ref[reshsource] [source file] |
Vuelve a cargar el código de un determinado archivo de código fuente. El archivo de código fuente que se va a cargar de nuevo debe formar parte del programa que se está ejecutando. Después de establecer la ruta de acceso del archivo de código fuente con el comando path, se puede utilizar el comando refreshsource para proporcionar el código fuente que falta. |
regd[efault] [force] |
Establece el depurador Just-In-Time (JIT) predeterminado en Cordbg.exe. El comando no ejecuta ninguna acción si ya se ha registrado otro depurador. Utilice el argumento force para sobrescribir el depurador JIT registrado. |
reg[isters] |
Muestra el contenido de los registros para el subproceso actual. |
rem[ove] [breakpoint id, ...] |
Vea delete. |
re[sume] [~] [tid] |
Reanuda el subproceso especificado por el argumento tid cuando el depurador continúa. Si se utiliza la sintaxis ~, la herramienta reanuda todos los subprocesos salvo el subproceso especificado. Si no se especifica un argumento, el comando no produce ningún efecto. |
r[un] [executable [args]] |
Interrumpe el proceso actual (si hay alguno) e inicia uno nuevo. Si no se especifica un argumento executable, este comando ejecuta el programa que se ejecutó anteriormente con el comando run. Si se especifica un argumento executable, la herramienta ejecuta el programa especificado utilizando los argumentos args proporcionados opcionalmente. Si Cordbg.exe está omitiendo los eventos de carga de clases, de carga de módulos y de inicio de subprocesos (opción predeterminada), el programa se detiene en la primera instrucción ejecutable del subproceso principal. |
set variable value |
Establece el valor del argumento variable especificado en el argumento value igualmente especificado. El valor puede ser un literal u otra variable. Para obtener información detallada, vea Utilizar el comando set en la sección Ejemplos. |
setip line number |
Establece que la próxima instrucción que se ha de ejecutar es la especificada por el número de línea line number. |
sh[ow] [count] |
Muestra líneas de código fuente. Si no se especifica un argumento, la herramienta muestra las cinco líneas de código fuente anteriores y posteriores a la línea de código fuente actual. Si se especifica un argumento, la herramienta muestra el número de líneas especificado anterior y posterior a la línea actual. El último argumento count especificado es el valor predeterminado para la sesión actual. |
si [<count>] |
Vea step. |
so [<count>] |
Vea next. |
ss[ingle] [count] |
Ejecuta paso a paso una o más instrucciones, realizando también paso a paso las instrucciones propias de las funciones. Si no se especifica un argumento, la herramienta ejecuta únicamente el paso correspondiente a una instrucción. Si se especifica un argumento, la herramienta ejecuta el número de pasos especificado. |
s[tep] [count] |
Ejecuta paso a paso el programa hasta la línea de código fuente siguiente, realizando también paso a paso las instrucciones propias de las funciones. Si no se especifica un argumento, el programa se ejecuta paso a paso en la línea siguiente. Si se especifica un argumento, el programa se ejecuta paso a paso en el número de líneas especificado. Se puede utilizar el comando si o el comando in del mismo modo que se utiliza el comando step. |
stop [[file:] line number] | [[class::] function[:offset]] | [=0xaddress] |
Vea break. |
su[spend] [~] [tid] |
Suspende el subproceso especificado por el argumento tid cuando el depurador continúa. Si se utiliza la sintaxis ~, la herramienta reanuda todos los subprocesos salvo el subproceso especificado. Si no se especifica un argumento, el comando no produce ningún efecto. |
t[hreads] [tid] |
Muestra una lista de subprocesos o establece el subproceso actual. Si no se especifica un argumento, la herramienta muestra la lista de todos los subprocesos que permanecen activos y que han ejecutado código administrado. Si se especifica un argumento, la herramienta hace que el subproceso especificado sea el subproceso actual. |
up [count] |
Desplaza hacia arriba el puntero del marco de pila para poder inspeccionar todos los marcos invocados por el proceso actual. Si no se especifica un argumento, el puntero del marco de pila se desplaza un marco hacia arriba. Si se especifica un argumento, el puntero del marco de pila se desplaza hacia arriba el número especificado de marcos de pila. Si existe información del nivel de código fuente, la herramienta presenta la línea de código fuente del marco. |
w[here] [count] |
Muestra un seguimiento de pila correspondiente al subproceso actual. Si no se especifica un argumento, la herramienta muestra un seguimiento de pila completo. Si se especifica un argumento, la herramienta muestra el número de marcos de pila especificado. |
wr[itememory] address count byte, ... |
Escribe los bytes especificados en el proceso de destino. El argumento address especifica la ubicación donde se escriben los bytes. El argumento count especifica el número de bytes que se escriben. Los argumentos byte especifican lo que se debe escribir en el proceso. Si el número de bytes de la lista es menor que el número especificado en el argumento count, la herramienta ajusta la lista de bytes y la copia de nuevo. Si el número de bytes de la lista es mayor que el número especificado en el argumento count, la herramienta no tiene en cuenta los bytes adicionales. |
wt |
Ejecuta paso a paso la aplicación mediante instrucciones nativas, empezando desde la instrucción actual e imprimiendo el árbol de llamadas según se desarrolla. La herramienta imprime el número de instrucciones nativas que se ejecutan en cada función con el seguimiento de llamadas. El seguimiento se detiene cuando la herramienta alcanza la instrucción devuelta de la función en que se produjo la ejecución del comando. Al final del seguimiento, la herramienta imprime el número total de instrucciones ejecutadas. Este comando es similar al comando wt del depurador simbólico de NT (NTSD) y se puede utilizar para obtener un análisis básico del rendimiento. Actualmente, la herramienta sólo efectúa recuentos en código administrado. |
x modulename ! string_to_look_for |
Muestra los símbolos del módulo especificado que coinciden con el modelo especificado por el argumento string_to_look_for. Se puede utilizar el asterisco (*) en el argumento string_to_look_for para indicar a la herramienta que busque cualquier cosa. La herramienta pasa por alto los caracteres situados detrás del carácter *. |
? [command ...] |
Vea help. |
>filename |
Escribe todos los comandos ejecutados en el argumento filename especificado. Si no se especifica el argumento filename, el comando detiene la escritura de comandos en el archivo. |
<filename |
Lee y ejecuta comandos en el archivo indicado por el parámetro filename. |
Nota
Los comandos de Cordbg.exe distinguen entre mayúsculas y minúsculas. Además, hay comandos que tienen sinónimos, lo que significa que se puede utilizar uno cualquiera de ellos y se obtiene el mismo resultado. Por ejemplo, se puede utilizar el comando break o el comando stop para establecer puntos de interrupción.
Argumentos de modo
Para especificar argumentos de modo, puede utilizar los caracteres mínimos necesarios para hacer el modo único. Por ejemplo, "mode m 1" equivale a "mode moduleloads 1".
Argumento |
Descripción |
---|---|
AppDomainLoads |
Muestra eventos de carga de ensamblados y dominios de la aplicación. |
ClassLoads |
Muestra eventos de carga de clases. |
DumpMemoryInBytes |
Muestra contenido de memoria, como bytes o DWORDS. |
EmbededCLR |
Establece el depurador para que tenga como destino aplicaciones de .NET Compact Framework que se ejecutan en dispositivos inteligentes. Para controlar este argumento, especifique 1 para activado o 0 para desactivado. |
EnhanceDiag |
Muestra información de diagnóstico mejorada. |
HexDisplay |
Muestra números en formato hexadecimal o decimal. |
ILNatPrint |
Muestra desplazamientos en lenguaje intermedio de Microsoft (MSIL) o en lenguaje relativo nativo. |
ISAll |
Avanza paso a paso por todos los interceptadores. |
ISClinit |
Avanza paso a paso por los inicializadores de clases. |
ISExceptF |
Avanza paso a paso por los filtros de excepciones. |
ISInt |
Avanza paso a paso por los interceptadores de usuario. |
ISPolicy |
Avanza paso a paso por las directivas de contexto. |
ISSec |
Avanza paso a paso por los interceptadores de seguridad. |
JitOptimizations |
Especifica si la compilación JIT genera código que se puede depurar. |
LoggingMessages |
Muestra mensajes del registro de código administrado. |
ModuleLoads |
Muestra eventos de carga de módulos. |
SeparateConsole |
Especifica si el proceso que se está depurando tendrá su propia consola. |
ShowArgs |
Muestra los argumentos de los métodos en el seguimiento de pila. |
ShowModules |
Muestra los nombres de los módulos en el seguimiento de pila. |
ShowStaticsOnPrint |
Muestra campos estáticos para objetos. |
ShowSuperClassOnPrint |
Muestra contenido de clase base para objetos. |
USAll |
Avanza paso a paso por todas las posiciones no asignadas de puntos de interrupción. |
USEpi |
Avanza paso a paso por epílogos de los métodos. |
USPro |
Avanza paso a paso por prólogos de los métodos. |
USUnmanaged |
Avanza paso a paso por código no administrado. |
Comentarios
La aplicación objeto de depuración se debe compilar utilizando indicadores 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 indicadores. 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 cordbg en el símbolo del sistema para iniciar una sesión de depuración, como se muestra en el ejemplo siguiente.
D:\Program Files\FrameworkSDK\Bin>cordbg
Microsoft (R) Common Language Runtime Test Debugger Shell. Version 2000.14.2100.0, Copyright (c) Microsoft Corp. 1998-2000
(cordbg)
El símbolo del sistema (cordbg) indica que se está en el depurador.
Una vez situado en el depurador, utilice los comandos y argumentos apropiados para invocar la funcionalidad requerida.
Cuando se inicia una sesión de depuración desde la línea de comandos, también se puede proporcionar el nombre de la aplicación que se desee depurar, los argumentos del programa y los argumentos opcionales. Los argumentos opcionales de Cordbg.exe son los mismos comandos que se utilizarían estando en Cordbg.exe pero deben llevar delante el carácter de exclamación de cierre (!). Para utilizar el carácter ! como un literal en una cadena se debe anteponer una barra inversa (\). Esto es necesario cuando se utiliza el comando x.
Si un argumento numérico de un comando cualquiera empieza por el prefijo 0x, Cordbg.exe da por supuesto que el argumento en cuestión está en formato hexadecimal. De lo contrario, supone que está en formato decimal.
La mayoría de los comandos de Cordbg.exe pueden incluir como prefijo un asterisco (*), que hace que el comando se ejecute una vez por cada subproceso administrado del proceso. El comando se ejecuta en el contexto de cada subproceso. El comando para el que resulta más útil incluir como prefijo un asterisco es el comando w[here]. Por ejemplo, *w hace que se imprima el seguimiento de pila de todos los subprocesos administrados.
Para obtener más información sobre los servicios de depuración del motor en tiempo de ejecución, vea la especificación Enabling Profiling and Debugging. Además, los programadores de herramientas deben ver las especificaciones Debug Overview y Debug Reference ubicadas en la carpeta Tools Developers Guide que se incluye en el Kit de desarrollo de software de Windows (SDK).
Ejemplos
Iniciar una sesión de Cordbg.exe
El comando siguiente inicia una sesión de Cordbg.exe para la aplicación MyApplication.exe con los argumentos del programa a y 2 y los comandos opcionales siguientes: establecer un punto de interrupción en la línea 42 de MyApplication.cs; continuar la aplicación; mostrar símbolos en MyApplication.exe coincidentes con la cadena 'SomeString'.
cordbg MyApplication.exe a 2 !b MyApplication.cs:42 !g !x MyApplication.exe\!SomeString
Ejecutar un archivo ejecutable dentro de una sesión de Cordbg.exe
El comando siguiente, escrito desde una sesión Cordbg.exe (en el símbolo (cordbg) ), ejecuta el archivo ejecutable MyApplication.exe con los argumentos de programa a y 2.
run MyApplication.exe a 2
Utilizar el comando print
Los comandos siguientes muestran que se puede utilizar el punto (.) con el comando print para especificar variables en objetos.
print obj.var1
print obj1.obj2.var1
Si una clase extiende otra clase, el comando print muestra los campos de la clase especificada y de la clase base. Por ejemplo, si la clase m1 tiene los campos a, b y c, y la clase m2 extiende la clase m1 y tiene los campos d, e y f, una instancia myInstance de m2 se imprime como se muestra a continuación.
myInstance = <addr> <m2>
a = 1
b = 2
c = 3
m2::d = 4
m2::e = 5
m2::f = 6
Se pueden especificar variables estáticas de clases anteponiendo al nombre de las variables el nombre de las clases, como se muestra a continuación.
print MyClass::StaticVar1
print System::Boolean::True
Los índices de matriz deben ser expresiones simples. Los índices de matriz siguientes son válidos para la utilización con el comando print.
print arr[1]
print arr[i]
print arr1[arr2[1]]
print md[1][5][myObject.a]
Los siguientes índices de matriz no son válidos para la utilización con el comando print, porque el índice de matriz no es una expresión simple.
print arr[i + 1]
print arr[i + 2]
Utilizar el comando set
Cuando se utiliza el comando set, el valor que se asigna a la variable especificada puede ser un literal u otra variable. A continuación se muestran usos válidos del comando set.
set int1 0x2a
set float1 3.1415
set char1 'a'
set bool1 true
set obj1 0x12345678
set obj1 obj2
set obj1.m_length[obj1.m_height] obj3.m_length[2]