Depuración de Aplicaciones C++ en Visual Studio: Una Guía Exhaustiva

Visual Studio es una herramienta poderosa para el desarrollo de software, y su depurador integrado es fundamental para identificar y corregir errores en aplicaciones C++. Este artículo explora en profundidad las diversas funcionalidades y configuraciones que ofrece Visual Studio para depurar eficazmente programas C++, desde los conceptos más básicos hasta escenarios avanzados.

Introducción a la Depuración en Visual Studio

Al depurar una aplicación, el objetivo principal es ejecutar el programa bajo la supervisión del depurador para observar su comportamiento en tiempo de ejecución. El depurador de Visual Studio proporciona una serie de herramientas que permiten examinar el flujo de ejecución del código, analizar los valores de las variables en puntos específicos y comprender cómo interactúan los diferentes componentes del programa. Si usted es nuevo en la depuración, se recomienda familiarizarse primero con los conceptos fundamentales leyendo recursos como "Depuración para principiantes sin experiencia" antes de adentrarse en este tutorial.

Este artículo se centra en la depuración de aplicaciones C++ utilizando Visual Studio. Si bien las capturas de pantalla y los ejemplos utilizan sintaxis de C++, la mayoría de las características presentadas son aplicables a otros lenguajes compatibles con Visual Studio, como C#, Visual Basic, F#, Python y JavaScript.

Visual Studio IDE with debugger active

Creación de un Proyecto de Aplicación de Consola C++

Para comenzar, es necesario crear un proyecto de aplicación de consola en Visual Studio. Los pasos para hacerlo son los siguientes:

  1. Abra Visual Studio.
  2. Seleccione "Crear un nuevo proyecto".
  3. Si la plantilla "Aplicación de consola" no aparece en los resultados de búsqueda, puede instalarla. En la sección "¿No encuentra lo que busca?", seleccione "Instalar más herramientas y características".
  4. En el Instalador de Visual Studio, elija la carga de trabajo "Desarrollo para el escritorio con C++" y actualice su instalación.
  5. Una vez seleccionada la plantilla "Aplicación de consola", ingrese "get-started-debugging" como nombre del proyecto y nombre de la solución.
  6. Visual Studio creará el nuevo proyecto y lo mostrará en el Explorador de soluciones.
#include <iostream>#include <string>#include <vector>int main() { std::vector<char> letters = {'f', 'r', 'e', 'd', ' ', 's', 'm', 'i', 't', 'h'}; std::string name = "Hello, "; std::wcout << L"Hello, " << name << L"!" << std::endl; // Salida inicial for (int i = 0; i < letters.size(); ++i) { name += letters[i]; std::wcout << L"Hello, " << name << L"!" << std::endl; } return 0;}

Iniciando la Sesión de Depuración

Una vez configurado el proyecto, puede iniciar la sesión de depuración. Esto se puede hacer de dos maneras:

  • Presionando la tecla F5.
  • Seleccionando "Depurar" > "Iniciar Depuración" en el menú principal.

El atajo F5 inicia la aplicación con el depurador adjunto al proceso. Inicialmente, no habrá nada particularmente interesante que examinar en el código, pero sentará las bases para las siguientes técnicas de depuración.

La ejecución inicial del programa producirá la siguiente salida en la consola:

Hello, Hello, !Hello, f!Hello, fr!Hello, fre!Hello, fred!Hello, fred !Hello, fred s!Hello, fred sm!Hello, fred smi!Hello, fred smit!Hello, fred smith!

Para detener el depurador, seleccione el icono de cuadrado rojo ("Detener") en la barra de herramientas de Depuración.

Puntos de Interrupción: Controlando la Ejecución

Los puntos de interrupción son una de las características más fundamentales y esenciales para una depuración confiable. Un punto de interrupción le indica a Visual Studio en qué línea de código desea que se suspenda la ejecución del programa.

Para establecer un punto de interrupción:

  1. Localice la línea de código name += letters[i]; en el editor.
  2. Haga clic en el margen izquierdo de esa línea. Aparecerá un círculo rojo, indicando que se ha establecido un punto de interrupción.

Visual Studio code editor with a breakpoint set

Cuando inicie la aplicación con F5 (o "Depurar" > "Iniciar Depuración"), Visual Studio ejecutará la aplicación y se detendrá en la primera instrucción marcada con un punto de interrupción. Verá una flecha amarilla apuntando al círculo rojo en el margen, indicando la instrucción donde el depurador está en pausa.

Es importante entender el comportamiento de F5:

  • Si la aplicación no se está ejecutando: F5 inicia la aplicación y la ejecución continúa hasta que se alcanza el primer punto de interrupción.
  • Si la aplicación ya se está ejecutando: F5 reanuda la ejecución hasta que el depurador alcanza el siguiente punto de interrupción o el final del programa.

Los puntos de interrupción son particularmente útiles cuando usted sabe qué sección específica del código desea examinar en detalle.

Comandos de Paso: Navegando por el Código

Una vez que el depurador se detiene en un punto de interrupción, puede usar comandos de paso para avanzar por el código instrucción por instrucción y observar cómo cambia el estado del programa.

Paso a Paso por Instrucciones (F11)

El atajo de teclado F11 ejecuta el comando "Paso a paso por instrucciones". Este comando avanza la ejecución del programa una instrucción a la vez. Es una excelente manera de examinar el flujo de ejecución con un nivel de detalle muy fino.

Por defecto, el depurador omite el código que no es considerado "código de usuario" (por ejemplo, código de bibliotecas del sistema). Para obtener más información sobre esta característica, consulte "Just My Code".

Paso a Paso por Procedimientos (F10)

El atajo de teclado F10 ejecuta el comando "Paso a paso por procedimientos". A diferencia de F11, F10 avanza el depurador sin entrar en las funciones o métodos del código de la aplicación. La ejecución continúa hasta el final de la instrucción actual, pero si esa instrucción llama a una función, esa función se ejecutará completamente sin que el depurador se detenga en su interior.

Por ejemplo, si F10 se selecciona en una llamada al método SendMessage (en lugar de F11), el depurador ejecutará el método SendMessage en su totalidad y se detendrá en la siguiente instrucción después de la llamada, sin depurar paso a paso por instrucciones dentro de SendMessage. Este enfoque es útil para omitir código que no necesita inspeccionar en este momento.

Ejecutar hasta Clic (Run to Click)

Otra forma conveniente de navegar por el código es utilizando la funcionalidad "Ejecutar hasta clic". Cuando el depurador está en pausa, puede colocar el puntero del ratón sobre una línea de código y aparecerá un icono de flecha verde ("Ejecutar hasta clic"). Al hacer clic en este icono, el depurador reanudará la ejecución del programa hasta alcanzar esa línea específica. Esta acción es útil para moverse rápidamente dentro de una región visible del código de la aplicación.

Visual Studio debugger with Run to Click icon highlighted

Reiniciar la Aplicación

Para reiniciar rápidamente la aplicación y volver a empezar la depuración desde el principio, seleccione el icono "Reiniciar" (una flecha circular) en la barra de herramientas de depuración. Al seleccionar "Reiniciar", el depurador pausará la ejecución en el primer punto de interrupción que encuentre durante la nueva ejecución.

Inspección de Variables: Comprendiendo el Estado del Programa

Las características que ayudan a inspeccionar variables son una de las ventajas más significativas de trabajar con un depurador. A menudo, al depurar un problema, uno intenta verificar si las variables almacenan los valores esperados en momentos concretos.

Sugerencias de Datos (DataTips)

Mientras el depurador está en pausa en una instrucción (por ejemplo, name += letters[i];), puede pasar el puntero del ratón sobre una variable (como letters). La característica de sugerencias de datos (DataTips) mostrará todos los elementos que la variable contiene, junto con sus valores actuales.

Visual Studio data tip showing variable values

Si selecciona F5 (Depurar > Continuar) varias veces, podrá iterar a través del bucle for y observar cómo cambian los valores de las variables en cada iteración.

Ventanas de Inspección: Autos y Variables Locales

Además de las sugerencias de datos, Visual Studio ofrece ventanas dedicadas para la inspección de variables:

  • Ventana Autos: Esta ventana muestra automáticamente todas las variables utilizadas en la línea actual o en la línea anterior, junto con sus valores actuales. Tenga en cuenta que el comportamiento específico de las variables y sus propiedades puede variar entre lenguajes de programación.
  • Ventana Variables Locales: Esta ventana muestra todas las variables que están actualmente dentro del ámbito local de la función o el bloque de código en el que se encuentra el depurador.

Ventana Inspección (Watch)

Para monitorear variables específicas a lo largo de la sesión de depuración, puede utilizar la ventana "Inspección".

  1. En el editor de código, haga clic derecho sobre la variable que desea inspeccionar (por ejemplo, name).
  2. Seleccione "Agregar inspección".
  3. La ventana "Inspección" se abrirá debajo del editor de código, mostrando la variable seleccionada y su valor.

A diferencia de las otras ventanas de variables, la ventana "Inspección" siempre mostrará las variables que usted ha decidido vigilar, independientemente de su ámbito actual o de la línea de ejecución. Esto es extremadamente útil para seguir la evolución de variables clave a través de diferentes partes del programa.

Ventana Pila de Llamadas (Call Stack)

La ventana "Pila de llamadas" en Visual Studio muestra el orden en que se han llamado los métodos y las funciones. Esta ventana es comparable a la "perspectiva de depuración" en otros entornos de desarrollo integrado (IDE) como Eclipse.

En la ventana "Pila de llamadas", la línea superior muestra la función actual (por ejemplo, SendMessage en nuestro ejemplo). Al hacer doble clic en una línea de código en la pila de llamadas, puede navegar directamente al código fuente de esa función. También puede acceder a menús contextuales para realizar acciones como insertar puntos de interrupción en funciones específicas, avanzar la ejecución hasta el cursor o ir al código fuente.

Visual Studio Call Stack window

Modificación de Variables en Tiempo de Ejecución

Una característica avanzada pero potente del depurador de Visual Studio es la capacidad de modificar los valores de las variables mientras el programa está en pausa. Esto puede ser útil para probar diferentes escenarios sin tener que recompilar y reiniciar la aplicación.

Por ejemplo, si el depurador se detiene en una línea y usted cambia el valor de una variable en la ventana "Variables Locales" o "Inspección", el programa continuará ejecutándose con el nuevo valor. Sin embargo, debe utilizar esta característica con precaución.

Al seleccionar la flecha amarilla que indica la instrucción actual, Visual Studio puede mostrar una advertencia indicando que cambiar la ejecución puede tener consecuencias imprevistas. Esto se debe a que modificar el estado del programa de forma arbitraria puede llevar a comportamientos inesperados o a la introducción de nuevos errores.

Configuración de Argumentos de Línea de Comandos

Para aplicaciones que esperan parámetros de entrada al inicio, es posible configurar estos argumentos de línea de comandos directamente en las propiedades del proyecto de Visual Studio.

A partir de Visual Studio 2026, puede establecer argumentos de línea de comandos para la aplicación en la lista desplegable de "Argumentos de la línea de comandos" dentro de las propiedades del proyecto. Esta característica está disponible para proyectos de C++, Unreal Engine y CMake.

Para configurar los argumentos:

  1. Haga clic derecho en el nombre de su proyecto en el Explorador de soluciones y seleccione "Propiedades".
  2. Navegue a "Propiedades de configuración" > "Depuración".
  3. En la sección "Depuración", busque el campo "Argumentos de la línea de comandos".
  4. Ingrese los argumentos deseados.

Por ejemplo, si su aplicación espera un nombre, podría ingresar "Fred Smith" como argumento. Al iniciar la depuración con F5, la aplicación recibirá estos argumentos.

La salida del programa podría cambiar para reflejar los argumentos proporcionados:

Hello, Hello, !Hello, f!Hello, fr!Hello, fre!Hello, fred!Hello, fred !Hello, fred s!Hello, fred sm!Hello, fred smi!Hello, fred smit!Hello, fred smith!

Los argumentos de línea de comandos se guardan en la lista desplegable para su uso futuro. También existe una opción para abrir la forma clásica de establecer argumentos, que para proyectos .vcxproj se realiza a través de la página de propiedades de configuración del proyecto, y para proyectos CMake, se edita el archivo vs.launch.json.

Operadores de Redirección

En el cuadro de argumentos de la línea de comandos, puede utilizar operadores de redirección para controlar la entrada y salida estándar del programa, especialmente útil para aplicaciones de consola:

  • < file: Lee stdin del archivo.
  • > file: Escribe stdout en el archivo.
  • >> file: Agrega stdout al archivo.
  • 2> file: Escribe stderr en el archivo.
  • 2>> file: Anexa stderr al archivo.
  • 2>&1: Envía stderr a la misma ubicación que stdout.
  • 1>&2: Envía stdout a la misma ubicación que stderr.

Para usar caracteres de escape en el comando, puede emplear valores ASCII, como %25 para reemplazar %.

Directorio de Trabajo de la Aplicación Remota

El "Directorio de trabajo de la aplicación remota" especifica el directorio en el sistema remoto donde se ejecutará su aplicación. Si se deja en blanco, el directorio de trabajo será el directorio del proyecto donde se encuentra el archivo ejecutable.

Depuración en Modo Mixto

Visual Studio permite habilitar más de un tipo de depurador en una única sesión de depuración, lo que se conoce como "depuración en modo mixto". Esto es particularmente útil cuando se trabaja con aplicaciones que combinan código nativo (C/C++) y código administrado (.NET Framework, C#, VB.NET).

Por ejemplo, puede depurar código nativo desde una aplicación administrada, o viceversa. Para habilitar la depuración en modo mixto:

  1. Vaya a las propiedades del proyecto.
  2. Seleccione "Propiedades de configuración" > "Depuración".
  3. En el desplegable "Tipo de depurador", elija "Mixto" o especifique los tipos de depurador que desea usar (por ejemplo, "Nativo, Administrado").

Si tiene una aplicación de .NET Framework que apunta a una DLL x64 nativa, es posible que necesite configurar la "Plataforma de destino" de "Cualquier CPU" a "x64". Esto se puede hacer a través del "Administrador de configuración" en la barra de herramientas de depuración.

Ejemplo de Depuración en Modo Mixto

Supongamos que tiene un proyecto C# que llama a una DLL nativa de C++ (Mixed_Mode_Debugging.dll).

Proyecto C++ (DLL):

  • Cree un proyecto de "Biblioteca de vínculos dinámicos (DLL)" en C++.
  • Asegúrese de que la configuración de compilación sea "Depurar" y la plataforma sea x86 o x64.
  • En las propiedades del proyecto, bajo "Enlazador" > "Avanzado", asegúrese de que "Sin punto de entrada" esté configurado en "No".
  • Bajo "General", en "Tipo de configuración", seleccione "Biblioteca dinámica (.dll)".
  • Compile este proyecto para generar Mixed_Mode_Debugging.dll.

Proyecto C#:

  • Cree un proyecto de aplicación de consola .NET.
  • Agregue una referencia a la DLL nativa de C++. En el código C#, use [DllImport("Mixed_Mode_Debugging.dll")] para importar las funciones nativas. Asegúrese de reemplazar la ruta de archivo de [DllImport] con la ruta correcta a su Mixed_Mode_Debugging.dll.
  • Establezca un punto de interrupción en el código C# que llama a la función de la DLL nativa.
  • Configure las propiedades de depuración del proyecto C# para habilitar la depuración en modo mixto (Nativo y Administrado).

Al iniciar la depuración, cuando el código C# llame a la función nativa, el depurador de Visual Studio podrá seguir la ejecución dentro de la DLL de C++, permitiéndole depurar ambas partes de la aplicación de forma integrada.

VSCode #5 - Depuración de Código, Extensiones, Migraciones | Jeison Peguero

Configuración Avanzada del Depurador

Visual Studio ofrece una gran cantidad de opciones de configuración para el depurador, accesibles a través de las páginas de propiedades del proyecto. Estas configuraciones afectan cómo se inicia, se ejecuta y se analiza el programa depurado.

Directorio de Trabajo de la Aplicación Remota

Como se mencionó anteriormente, este campo especifica el directorio de trabajo en el equipo remoto.

Tipo de Depurador

Especifica el tipo de depurador que se va a usar. Las opciones comunes incluyen:

  • Solo Nativo: Para depurar código C/C++.
  • Solo Administrado: Para depurar código .NET.
  • Solo GPU: Para depurar código C++ AMP que se ejecuta en una GPU.
  • Mixto: Para depurar combinaciones de código nativo y administrado.
  • Automático: Visual Studio intenta detectar el tipo de código y adjuntar el depurador apropiado (valor predeterminado).
  • Script: Para depurar scripts del lado del cliente.

Tipo de Acelerador de Depuración (GPU)

Para la depuración de código de GPU, como C++ AMP, se puede especificar el tipo de acelerador de depuración que se va a utilizar, invalidando la selección predeterminada del acelerador de C++ AMP.

Variables de Entorno

Puede especificar las variables de entorno para el programa que se depura. Esto se hace utilizando la sintaxis estándar de variables de entorno (por ejemplo, PATH="%SystemRoot%\..."). Estas variables pueden reemplazar el entorno del sistema o fusionarse con él, dependiendo de la configuración de "Fusionar entorno". Al hacer clic en la columna derecha, aparece un enlace "Editar…" que abre el Editor de propiedades para una edición más detallada.

Habilitar Depuración de SQL

Es posible habilitar la depuración de procedimientos SQL desde aplicaciones de Visual C++.

Acelerador de AMP Predeterminado

Especifica el acelerador predeterminado de AMP al depurar código de GPU.

Directorio de Implementación

Especifica la ruta de acceso en el equipo remoto donde se copian los resultados del proyecto antes del lanzamiento. La configuración predeterminada está vacía, lo que significa que la salida del proyecto no se copia. Para habilitar la implementación de archivos, también debe activar la casilla "Implementar" en el Administrador de configuración.

Archivos Adicionales para Copiar

Si se establece la propiedad "Directorio de implementación", puede especificar una lista delimitada por punto y coma de carpetas o archivos adicionales que se copiarán en el directorio de implementación.

Copiar Bibliotecas de Tiempo de Ejecución de Visual C++

Esta opción determina si las bibliotecas de tiempo de ejecución de depuración de Visual C++ de la plataforma actual deben copiarse en el recurso compartido de red.

Información de Depuración

Especifica el tipo de información de depuración que se va a crear para el proyecto. La opción predeterminada (/ZI) crea una base de datos de programa (PDB) en un formato compatible con "Editar y continuar".

Optimización del Código

Especifica si el compilador debe optimizar el código generado. La optimización puede cambiar el código ejecutable, lo que dificulta la depuración al hacer que el código optimizado no coincida con el código fuente. La opción predeterminada (/Od) suprime la optimización.

Archivo de Base de Datos de Programa (PDB)

Puede especificar el nombre de un archivo PDB. Si no desea incluir símbolos privados en el archivo PDB (por ejemplo, para enviar a los clientes), puede crear un segundo archivo PDB que omita estos símbolos.

Archivo de Mapa

Indica al enlazador que genere un archivo de mapa durante la vinculación. Puede especificar el nombre de este archivo y si se deben incluir las funciones exportadas.

Configuración del Vinculador

Especifica la configuración de la opción /ASSEMBLYDEBUG del vinculador, que puede incluir seguimiento de tiempo de ejecución y deshabilitar optimizaciones.

Depuración de Bibliotecas Estáticas y DLLs

Para depurar tipos de proyecto como bibliotecas estáticas y DLLs, el proyecto de Visual Studio debe ser capaz de encontrar los archivos correctos.

  • Bibliotecas y DLLs dentro de la solución: Cuando el código fuente está disponible, puede agregar bibliotecas estáticas y DLLs como proyectos independientes a la misma solución. Esto facilita la depuración, ya que Visual Studio puede vincular directamente al código fuente.
  • Depuración de DLLs externas: Para depurar archivos DLL que son externos a su proyecto, puede configurar las propiedades del depurador para que apunten a la DLL y a sus símbolos (archivos PDB).

Puntos de Interrupción Condicionales

Los puntos de interrupción condicionales son una herramienta avanzada que le permite detener la ejecución solo cuando se cumplen ciertas condiciones. Esto es extremadamente útil cuando se depuran bucles o código recursivo, o cuando se desea inspeccionar una variable solo cuando alcanza un valor específico.

Para establecer un punto de interrupción condicional:

  1. Haga clic derecho en un punto de interrupción existente o cree uno nuevo.
  2. Seleccione "Condiciones…".
  3. En el cuadro de diálogo, ingrese una expresión booleana. El depurador se detendrá solo cuando esta expresión sea verdadera. Por ejemplo, podría establecer una condición como i == 5 para detenerse solo cuando el índice del bucle sea 5.

Conclusión Provisional

Visual Studio ofrece un entorno de depuración robusto y versátil para aplicaciones C++. Desde la configuración básica de puntos de interrupción y el uso de comandos de paso hasta la inspección detallada de variables y la depuración en modo mixto, las herramientas disponibles permiten a los desarrolladores identificar y resolver problemas de manera eficiente. La correcta utilización de estas funcionalidades es clave para el desarrollo de software de alta calidad.

tags: #depurar #programa #con #parametros #c #visual