visual-studio - tutorial - visual studio code html preview
¿Cuáles son las implicaciones de usar/Zi vs/Z7 para proyectos de Visual Studio C++? (4)
Codeview es un formato de depuración mucho más antiguo que se introdujo con el viejo depurador autónomo de Microsoft en los días del "compilador C de Microsoft" de mediados de los años ochenta. Ocupa más espacio en disco y el depurador tarda más en analizar, y es un gran problema procesarlo durante la vinculación. Lo generamos desde nuestro compilador cuando estaba trabajando en el CodeWarrior para Windows en 1998-2000.
La única ventaja es que Codeview es un formato documentado, y otras herramientas a menudo pueden procesarlo cuando no pueden tratar con bases de datos de depuración de formato PDB. Además, si está compilando varios archivos a la vez, no hay contención para escribir en la base de datos de depuración para el proyecto. Sin embargo, para la mayoría de los usos en estos días, usar el formato PDB es una gran ganancia, tanto en el tiempo de compilación como especialmente en el tiempo de inicio del depurador.
Fondo
Hay varios indicadores de depuración diferentes que puede usar con el compilador de Visual Studio C ++. Son:
- (ninguna)
- No crea información de depuración
- Tiempos de compilación más rápidos
- / Z7
- Produzca información de depuración simbólica completa en los archivos .obj utilizando el formato CodeView
- / Zi
- Produzca información de depuración simbólica completa en un archivo .pdb para el destino utilizando el formato de la Base de datos del programa.
- Habilita el soporte para reconstrucciones mínimas (/ Gm) que pueden reducir el tiempo necesario para la recompilación.
- / ZI
- Produzca información de depuración como / Zi, excepto con soporte para Editar-y-Continuar
Cuestiones
El indicador / Gm es incompatible con el indicador / MP para compilaciones de procesos múltiples (Visual Studio 2005/2008)
Si desea habilitar reconstrucciones mínimas, entonces la bandera / Zi es necesaria sobre la bandera / Z7.
Si va a utilizar el indicador / MP, aparentemente no hay diferencia entre / Z7 y / Zi mirando a MSDN. Sin embargo, la documentación de SCons indica que debe usar / Z7 para admitir compilaciones paralelas.
Preguntas
¿Cuáles son las implicaciones de usar / Zi vs / Z7 en un proyecto de Visual Studio C ++?
¿Hay otros pros o contras para cualquiera de estas opciones que me he perdido?
Específicamente, ¿cuál es el beneficio de un solo archivo de formato de base de datos de programa (PDB) para el destino frente a múltiples archivos en formato CodeView (.obj) para cada fuente?
Referencias
MDSN / Z7, / Zi, / ZI (formato de información de depuración)
MSDN / MP (compilación con múltiples procesos)
Hay una desventaja más para / Z7: no es compatible con la vinculación incremental, que solo puede ser una razón para evitarla. Enlace: http://msdn.microsoft.com/en-us/library/4khtbfyf%28v=vs.100%29.aspx
Por cierto: aunque Microsoft dice que se realiza un enlace completo (en lugar de un incremento) cuando "Un objeto que se compiló con la opción / Yu / Z7 se cambia", parece que esto solo es cierto para la creación de bibliotecas estáticas con / Z7, no para archivos de objeto.
Otra desventaja de / Z7 es el gran tamaño de los archivos objeto. Esto ya se ha mencionado aquí, sin embargo, esto puede escalar hasta el punto en que el enlazador no puede vincular el ejecutable porque rompe el límite de tamaño del enlazador o el formato PE (le da error de enlazador LNK1248). Parece que Visual Studio o el formato PE tiene un límite duro de 2 GB (también en máquinas x64). Al construir una versión de depuración, puede encontrarse con este límite. Parece que esto no solo afecta el tamaño del ejecutable compilado final, sino también los datos temporales. Solo Microsoft sabe acerca de las partes internas del enlazador, pero nos topamos con este problema aquí (aunque el ejecutable por supuesto no era 2gigs grande, incluso en depuración). El problema desapareció milagrosamente y nunca regresó cuando cambiamos el proyecto a / ZI.
Una ventaja del antiguo formato C7 es que es todo-en-uno, almacenado en el EXE, en lugar de un PDB y EXE por separado. Esto significa que nunca puedes tener un desajuste. Las herramientas de desarrollo VS se asegurarán de que un PDB coincida con su EXE antes de que lo use, pero es definitivamente más simple tener un solo EXE con todo lo que necesita.
Esto agrega nuevos problemas de la necesidad de poder quitar la información de depuración cuando se lanza, y el archivo EXE gigante, por no mencionar el antiguo formato y la falta de soporte para otras características modernas como minrebuild, pero aún puede ser útil cuando estás tratando de mantener las cosas lo más simple posible. Un archivo es más fácil que dos.
No es que alguna vez use el formato C7, solo estoy exponiendo esto como una posible ventaja, ya que estás preguntando.
A propósito, así es como GCC hace cosas en un par de plataformas que estoy usando. El formato DWARF2 está enterrado en los ELF de salida. La gente de Unix piensa que son muy graciosas. :)
Por cierto, el formato PDB se puede analizar utilizando el DIA SDK .