2011-06-15 26 views
25

Tengo la tentación de incluir información de depuración en mis compilaciones de lanzamiento que se envían a los clientes. Por lo que veo, el único inconveniente es un aumento del 25% en el tamaño del archivo binario. La ventaja es que puedo obtener un volcado de emergencia inmediatamente utilizable, mucho más fácil de analizar. Estoy dispuesto a vivir con el aumento del 25%. ¿Hay alguna otra desventaja que me falta?Visual Studio: información de depuración en la compilación de lanzamiento

Este es un proyecto de C y todo lo que quiero hacer está vinculado/Depuración/Generar información de depuración

Respuesta

35

El tamaño del ejecutable debe aumentar mucho menos del 25%.

Estoy realmente un poco sorprendido de que aumente mucho, pero algunas pruebas rápidas muestran que al menos un gran proyecto de ejemplo (ScummVM) aumenta el .exe de 10,205,184 bytes a 10,996,224 bytes simplemente agregando la opción /DEBUG a el paso del enlace (aproximadamente un aumento del 8%). /DEBUG se especifica utilizando la opción "Linker | Debugging | Generate Debug Info" en el IDE. Tenga en cuenta que esta configuración debería no tiene ningún efecto en las optimizaciones generadas por el compilador.

Sé que se coloca un puntero al archivo .pdb en el ejecutable, pero no hay mucho de eso. Experimenté un poco y descubrí que habilitar la opción del enlazador /OPT:NOREF cambió la diferencia de tamaño a 10,205,184 frente a 10,205,696. Así que la construcción que no es /DEBUG se mantuvo del mismo tamaño, pero la construcción /DEBUG se redujo a solo 512 bytes más (lo que podría explicarse por el puntero a .pdb; tal vez el enlazador redondee a un múltiplo de 512 o algo así). Mucho menos del 1% de aumento. Aparentemente, agregar /DEBUG hace que el enlazador mantenga objetos sin referencia a menos que también especifique /OPT:NOREF. (Opción "Linker | Optimization | References" en el IDE).

El programa funcionará bien sin el archivo .pdb; puede optar por enviarlo a los clientes si desea proporcionar una mejor experiencia de depuración en el sitio del cliente. Si solo desea obtener rastros de pila decentes, no necesita tener el archivo .pdb en la máquina del cliente; ellos (o alguna herramienta/funcionalidad que proporcione) pueden enviar un archivo de volcado que se puede cargar en un archivo. depurar en su sitio con el archivo .pdb disponible y obtener la misma información de rastreo de pila port-mortem.

Por supuesto, una cosa es tener que archivar los archivos .pdb junto con sus lanzamientos. El paquete "Herramientas de depuración para Windows" (que ahora se distribuye en el SDK de Windows) proporciona una herramienta de servidor de símbolos para que pueda archivar .pdbs y recuperarlos fácilmente para la depuración.

El único inconveniente que se me ocurre al distribuir archivos .pdb es que puede facilitar la ingeniería inversa de su aplicación, si eso le preocupa.Tenga en cuenta que Microsoft distribuye símbolos para Windows (utilizando un servidor de símbolos público, así como paquetes de los conjuntos de símbolos completos para algunas versiones específicas). Sin embargo, los símbolos que distribuyen se pasan por un paso de desinfección que elimina ciertos elementos que consideran sensibles. Puede hacer lo mismo (o similar) utilizando la opción /PDBSTRIPPED del vinculador ("Linker | Debugging | Strip Private Symbols" en el IDE). Consulte the MSDN docs para obtener detalles sobre lo que elimina la opción. Si va a distribuir símbolos, probablemente sea apropiado usar esa opción.

+0

Aparentemente, SCUMVM tiene muy poco código sin referencia :) Después de habilitar la extracción de símbolos sin referencia el tamaño del ejecutable volvió a la normalidad. ¡Muchas gracias! –

+0

Gracias por señalar la referencia del enlazador – Gob00st

-7

siempre enviará la versión de depuración, no la versión de lanzamiento. No puedo pensar en ninguna desventaja, y las ventajas son como usted menciona.

+4

optimizaciones son cosas útiles – SLaks

+2

@SLAks sí, de acuerdo. No estoy haciendo una compilación de depuración, sino una compilación de lanzamiento con información de depuración ... mi entendimiento es que todavía tiene todas las optimizaciones, solo algunos símbolos de depuración también incluidos. Bueno, eso es lo que intento aclarar con esta pregunta. –

+0

Imagínese un concesionario de automóviles que dice "Siempre vendo prototipos de laboratorio, no el coche real de la fábrica" ​​... Ah, y probablemente no se le permita distribuir el tiempo de ejecución de depuración a los clientes (IANAL, pero eche un vistazo a la licencia de tu compilador). – Tibo

1

No menciona en qué idioma se encuentra, puede haber diferentes respuestas para C++ vs. C#.

No estoy 100% seguro de qué cambio está considerando realizar. ¿Le dirá a Visual Studio que cree su compilación Debug estándar y la envíe, o va a editar algunas configuraciones en la compilación de Release? Una modificación cuidadosa de la configuración de una pareja en la compilación Release me parece el mejor enfoque.

Sea lo que sea que termine, me aseguraré de que las optimizaciones estén activadas, ya que eso puede hacer una gran diferencia en el rendimiento del código compilado.

+0

He actualizado la pregunta con las aclaraciones solicitadas. –

+0

Pero la otra pregunta es ... ¿cómo me aseguro de que las optimizaciones todavía estén? Quiero decir, están habilitados, pero ¿qué sucede si "generar información de depuración" anula la configuración y los desactiva? –

+0

Si está en el plano C, esta configuración se encuentra en las Páginas de propiedades del proyecto, en Propiedades de configuración :: C/C++ :: Optimización. Creo que los valores predeterminados son Optimización desactivada (/ Od) para compilaciones de depuración y Maximizar velocidad (/ O2) para compilaciones de versión. –

2

De acuerdo con la documentación VS2005 en http://msdn.microsoft.com/en-us/library/xe4t6fc1(v=vs.80).aspx:

/DEBUG cambia los valores predeterminados de la opción/OPT de la referencia a NOref y del ICF a NOICF (así, tendrá que especificar explícitamente/OPT: REF o /OPT: ICF).

me ayudó mi caso cuando me activados los dos:

/O2 /DEBUG /OPT:REF /OPT:ICF 
Cuestiones relacionadas