La diferencia entre lanzamiento y depuración
La depuración generalmente se denomina versión de depuración, que contiene información de depuración sin ninguna optimización, lo que facilita a los programadores depurar programas.
Orden. La versión de lanzamiento se denomina versión de lanzamiento y a menudo se utiliza para optimizar el programa en términos de tamaño del código y velocidad de ejecución.
Ambas son óptimas y permiten a los usuarios utilizarlas bien.
El verdadero secreto para depurar y publicar reside en un conjunto de opciones de compilación. Cada opción se enumera a continuación.
(Por supuesto que hay otros, como /Fd /Fo, pero la diferencia no es importante, generalmente no causarán Rele.
La versión de Ase es incorrecta y no causará se discutirá aquí)
p>
Versión de depuración:
/MDd /MLd o /MTd usa la biblioteca de tiempo de ejecución de depuración (versión de depuración de la biblioteca de funciones de tiempo de ejecución).
/OdDesactivar el interruptor de optimización
/D "_DEBUG" es equivalente a #define _DEBUG. Active el interruptor de compilación y depuración de código (utilizado principalmente para
función de aserción)
/ZI crea una base de datos "Editar y continuar" para la depuración.
Si el código fuente se modifica durante este proceso, no es necesario volver a compilarlo.
/GZ puede ayudar a detectar errores de memoria.
/Gm Active el interruptor de minimizar la vinculación para reducir el tiempo de vinculación.
Versión de lanzamiento:
/MD /ML o /MT utiliza la versión de lanzamiento de la biblioteca en tiempo de ejecución.
El interruptor de optimización /O1 o /O2 hace que el programa sea más pequeño o más rápido.
/D "NDEBUG" desactiva la compilación condicional y el interruptor de código de depuración (es decir, la función de afirmación no se compila).
/GF fusiona cadenas duplicadas y coloca constantes de cadena en la memoria de solo lectura para evitar
que se modifiquen
De hecho, entre la depuración y la publicación no hay Hay un límite esencial entre ellos, son solo un conjunto de opciones de compilación y el dispositivo solo funciona de acuerdo con las opciones predeterminadas. De hecho, incluso podremos modificar estas opciones para obtener claves optimizadas.
Una versión de prueba o de lanzamiento con una declaración de seguimiento.
2. ¿En qué circunstancias la versión de lanzamiento saldrá mal?
Con la introducción anterior, comparemos estas opciones una por una para ver cómo ocurre el error de la versión de lanzamiento.
1. Biblioteca de tiempo de ejecución:
2. Optimización: existen principalmente los siguientes errores:
(1) Puntos suspensivos del puntero del marco (FPO para abreviar): en Durante una llamada a una función, toda la información de la llamada
(dirección del remitente, parámetros) y las variables automáticas se colocan en la pila. Si la declaración y la implementación de la función son diferentes (parámetros, valor de retorno
valor de retorno, modo de llamada), se producirá un error, pero en el modo de depuración, se accede a la pila a través del registro EBP.
Guarde la implementación de la dirección, si no hay errores como intersecciones de matriz (o "no muchas" intersecciones), la función generalmente
se puede ejecutar normalmente en el modo de lanzamiento, la optimización se ejecutará; omita el puntero base de la pila EBP para que se pueda acceder a la pila a través del puntero global.
Provocará un error en la dirección del remitente, es decir, el programa se bloqueará. La potente función de escritura de C puede detectar la mayoría de estos errores, pero no funcionará si, por ejemplo, se utilizan conversiones. Puede forzar la opción /Oy-compile en las versiones de lanzamiento.
Omita el puntero de caída de fotograma para determinar si existe dicho error.
(2) Variable volátil: volátil le dice al compilador que la variable puede modificarse de formas desconocidas fuera del programa.
(Como sistema, otros procesos, subprocesos).
(3) Optimización de variables: el optimizador optimizará las variables según su propósito.
Por ejemplo, una de las funciones no está
En la compilación de depuración, la variable utilizada puede sobrescribir una matriz fuera de límites, mientras que en la compilación de lanzamiento, esta variable
Es probable que se optimice cuando Cuando una matriz se sale de los límites, destruye datos útiles en la pila. Por supuesto, la situación real es más complicada que esto.
Mucho. Los errores relacionados con esto son:
3 _DEBUG y NDEBUG: cuando se define _DEBUG, la función afirmar() se compilará, pero NDEBUG no.
Ser compilado. Además, hay una serie de macros de aserción en VC. Esto incluye:
ANSI C afirma void afirmar (expresión int);
c runtime Lib afirma _ ASSERT (expresión booleana);
_ ASSERTE (expresión booleana) );
MFC afirma ASSERT(expresión booleana);
VERIFY(expresión booleana);
ASSERT _ VALID(po objeto);
ASSERT_KINDOF(nombre de clase, objeto po);
ATL afirma ATLASSERT(expresión booleana);
Además, la compilación de la macro TRACE() también está controlada por _DEBUG.
Opción 4./GZ: Esta opción realizará las siguientes operaciones.
(1) Inicializar memoria y variables.
(2) Al llamar a una función a través de un puntero de función, se verificará el puntero de la pila para verificar la coincidencia de la llamada de función. (Evita
discordancia de forma genuina)
(3) Verifique el puntero de la pila antes de que la función regrese para confirmar que no se ha modificado.
En tercer lugar, cómo "depurar" el programa de lanzamiento
1. Como se mencionó anteriormente, Debug y Release son solo un conjunto de opciones de compilación, y en realidad no hay nada.
La definición permite distinguir entre ambos. Podemos modificar las opciones de compilación de la versión de lanzamiento para limitar el alcance del error. Como se mencionó anteriormente, puede
cambiar las opciones de lanzamiento una por una a las opciones de depuración correspondientes, como /MD a /MDd y /O1 a /Od.
, o cambie la optimización del tiempo de ejecución a la optimización del tamaño del programa. Tenga en cuenta que solo cambiar una opción a la vez hará que el error desaparezca según la opción que cambie.
Si pierde, busque las opciones relacionadas con errores de manera específica. Estas opciones están disponibles en Proyecto\Configuración...
Para ser seleccionadas directamente de la lista, normalmente no las modifique manualmente. Dado que el análisis anterior es bastante completo, este método es el más completo.
Válido.
2. También puedes depurar tu versión de lanzamiento como Debug, solo agrega símbolos de depuración. En Configuración del proyecto..., seleccione Configuración para "Versión Win32", seleccione la pestaña C/C y luego seleccione Categoría.
General, información de depuración, selección de base de datos del programa. Al final de la pestaña Enlaces, opciones del proyecto.
Agrega "/OPT:REF" (no pierdas las comillas).