Share via


Depuración en modo de origen

La depuración de una aplicación es más fácil si puede analizar el origen del código, en lugar de los binarios desensamblados.

WinDbg, CDB y KD pueden usar código fuente en la depuración, si el lenguaje de origen es C, C++o ensamblado.

Requisitos de compilación

Para usar la depuración de origen, debe hacer que el compilador o el enlazador creen archivos de símbolos (archivos .pdb) cuando se compilan los archivos binarios. Estos archivos de símbolos muestran al depurador cómo se corresponden las instrucciones binarias con las líneas de origen.

Además, el depurador debe poder acceder a los archivos de origen reales, ya que los archivos de símbolos no contienen el texto de origen real.

Si es posible, el compilador y el enlazador no deben optimizar el código. La depuración de origen y el acceso a variables locales son más difíciles y, a veces, casi imposibles, si el código se ha optimizado. Si usa la utilidad Build como compilador y enlazador, establezca la macro MSC_OPTIMIZATION en /Od /Oi para evitar la optimización.

Buscar los archivos de símbolos y los archivos de origen

Para depurar en modo de origen, el depurador debe poder encontrar los archivos de origen y los archivos de símbolos. Para obtener más información, consulte Ruta de acceso de origen.

Inicio de la depuración de origen

El depurador puede mostrar información de origen siempre que tenga símbolos y archivos de origen adecuados para el subproceso que se está depurando actualmente.

Si inicia una nueva aplicación en modo de usuario mediante el depurador, la interrupción inicial se produce cuando Ntdll.dll carga la aplicación. Dado que el depurador no tiene acceso a los archivos de origen de Ntdll.dll, no puede acceder a la información de origen de la aplicación en este momento.

Para mover el contador del programa al principio de la aplicación, agregue un punto de interrupción en el punto de entrada al binario. En la ventana Comando del depurador, escriba el siguiente comando.

bp main
g

A continuación, la aplicación se carga y se detiene cuando se escribe la función principal . (Por supuesto, puede usar cualquier punto de entrada, no solo main).

Si la aplicación produce una excepción, se divide en el depurador. La información de origen está disponible en este momento. Sin embargo, si emite un salto mediante CTRL+C, CTRL+BREAK o Depurar | El comando Break, el depurador crea un subproceso, por lo que no puede ver el código fuente.

Después de haber llegado a un subproceso para el que tiene archivos de origen, puede usar la ventana Comando del depurador para ejecutar comandos de depuración de origen. Si usa WinDbg, aparecerá la ventana Origen . Si ya ha abierto una ventana Origen haciendo clic en Archivo de código abierto en el menú Archivo , WinDbg normalmente crea una nueva ventana para el origen. Puede cerrar la ventana anterior sin afectar al proceso de depuración.

Depuración de origen en la GUI de WinDbg

Si usa WinDbg, aparece una ventana De origen en cuanto el contador de programas se encuentra en el código para el que el depurador tiene información de origen.

WinDbg muestra una ventana De origen para cada archivo de origen que usted o WinDbg abrió. Para obtener más información sobre las propiedades de texto de esta ventana, vea Ventanas de origen.

Después, puede recorrer la aplicación o ejecutarla en un punto de interrupción o en el cursor. Para obtener más información sobre los comandos de ejecución paso a paso y seguimiento, vea Controlar el destino.

Si está en modo de origen, la ventana Origen adecuada se mueve al primer plano mientras recorre la aplicación. Dado que también hay rutinas de Microsoft Windows a las que se llama durante la ejecución de la aplicación, el depurador podría mover una ventana Desensamblado al primer plano cuando se produce este tipo de llamada (porque el depurador no tiene acceso al origen de estas funciones). Cuando el contador del programa vuelve a archivos de origen conocidos, la ventana Origen adecuada se activa.

A medida que avanza por la aplicación, WinDbg resalta la ubicación en la ventana Origen y la ventana Desensamblado. También se resaltan las líneas en las que se establecen puntos de interrupción. El código fuente se colorea según el análisis del idioma. Si se ha seleccionado la ventana Origen, puede mantener el puntero sobre un símbolo con el mouse para evaluarlo. Para obtener más información sobre estas características y cómo controlarlas, consulte Windows de origen.

Para activar el modo de origen en WinDbg, use el comando l+t , haga clic en modo de origen en el menú depurar o haga clic en el modo de origen en el botón. Cuando el modo de origen está activo, el indicador ASM no aparece disponible en la barra de estado.

Puede ver o modificar los valores de cualquier variable local mientras recorre una función en modo de origen. Para obtener más información, vea Lectura y escritura de memoria.

Depuración de origen en la ventana Comandos del depurador

Si usa CDB, no tiene una ventana de origen independiente. Sin embargo, todavía puede ver el progreso a medida que recorre el origen.

Antes de poder realizar la depuración de origen en CDB, debe cargar símbolos de línea de origen emitiendo el comando .lines (Alternar compatibilidad con líneas de origen) o iniciando el depurador con la opción de línea de comandos -lines.

Si ejecuta un comando l+t , toda la ejecución paso a paso del programa se realiza una línea de origen a la vez. Use l-t para realizar el paso de una instrucción de ensamblado a la vez. Si usa WinDbg, este comando tiene el mismo efecto que seleccionar o desactivar el modo de origen en el menú Depurar o mediante los botones de la barra de herramientas.

El comando l+s muestra la línea de origen actual y el número de línea en el símbolo del sistema. Si desea ver solo el número de línea, use l+l en su lugar.

Si usa l+o y l+s, solo se muestra la línea de origen mientras recorre el programa. El contador del programa, el código de desensamblaje y la información de registro están ocultas. Este tipo de pantalla le permite recorrer rápidamente el código y ver nada más que el origen.

Puede usar el comando lsp (Establecer número de líneas de origen) para especificar exactamente cuántas líneas de origen se muestran al recorrer o ejecutar la aplicación.

La siguiente secuencia de comandos es una manera eficaz de recorrer un archivo de código fuente.

.lines        enable source line information
bp main       set initial breakpoint
l+t           stepping will be done by source line
l+s           source lines will be displayed at prompt
g             run program until "main" is entered
pr            execute one source line, and toggle register display off
p             execute one source line 

Dado que ENTRAR repite el último comando, ahora puede recorrer la aplicación mediante la tecla ENTRAR. Cada paso hace que aparezca la línea de origen, el desplazamiento de memoria y el código de ensamblado.

Para obtener más información sobre cómo interpretar la pantalla de desensamblaje, vea Depuración en modo de ensamblado.

Cuando se muestra el código de ensamblado, se muestra cualquier ubicación de memoria a la que se accede en el extremo derecho de la línea. Puede usar los comandos d* (Memoria para mostrar) y e* (Escribir valores) para ver o cambiar los valores de estas ubicaciones.

Si tiene que ver cada instrucción de ensamblado para determinar desplazamientos o información de memoria, use l-t para realizar instrucciones paso a paso por ensamblado en lugar de líneas de origen. Todavía se puede mostrar la información de la línea de origen. Cada línea de origen corresponde a una o varias instrucciones de ensamblado.

Todos estos comandos están disponibles en WinDbg y en CDB. Puede usar los comandos para ver la información de línea de origen desde la ventana Comando del depurador de WinDbg en lugar de desde la ventana Origen.

Líneas y desplazamientos de origen

También puede realizar la depuración de origen mediante el evaluador de expresiones para determinar el desplazamiento que corresponde a una línea de origen específica.

El comando siguiente muestra un desplazamiento de memoria.

? `[[module!]filename][:linenumber]` 

Si omite el nombre de archivo, el depurador busca el archivo de origen que corresponde al contador del programa actual.

El depurador lee linenumber como un número decimal a menos que se agregue 0x antes, independientemente del radix predeterminado actual. Si omite linenumber, la expresión se evalúa como la dirección inicial del archivo ejecutable que corresponde al archivo de origen.

Esta sintaxis solo se entiende en CDB si el comando .lines o la opción de línea de comandos -lines tiene símbolos de línea de origen cargados.

Esta técnica es muy versátil, ya que se puede usar independientemente de dónde apunta el contador del programa. Por ejemplo, esta técnica permite establecer puntos de interrupción de antemano mediante comandos como los siguientes.

bp `source.c:31` 

Para obtener más información, vea Sintaxis de línea de origen y Uso de puntos de interrupción.

Ejecución paso a paso y seguimiento en modo de origen

Al depurar en modo de origen, puede haber varias llamadas de función en una sola línea de origen. No puede usar los comandos p y t para separar estas llamadas de función.

Por ejemplo, en el siguiente comando, el comando t realiza los pasos tanto en GetTickCount como en printf, mientras que el comando p realiza los pasos en ambas llamadas de función.

printf( "%x\n", GetTickCount() );

Si desea recorrer paso a paso por instrucciones determinadas llamadas mientras realiza el seguimiento en otras llamadas, use .step_filter (Establecer filtro de paso) para indicar qué llamadas se van a recorrer paso a paso por instrucciones.

Puede usar _step_filter para filtrar las funciones del marco (por ejemplo, Microsoft Foundation Classes (MFC) o las llamadas a la Biblioteca de plantillas activas (ATL).