2009-02-23 4 views
7

Estoy buscando una herramienta para simplificar el análisis de un archivo de mapa enlazador para un gran proyecto de C++ (VC6).Análisis de archivos MAP: ¿de dónde viene el tamaño del código?

Durante el mantenimiento, los binarios crecen constantemente y quiero averiguar de dónde viene. Sospecho que una expansión de plantillas exagerada en una biblioteca compartida entre diferentes DLL, pero jsut browsign el archivo de mapa no da buenas pistas.

¿Alguna sugerencia?

Respuesta

6

This es un maravilloso compilador generado herramienta de análisis/explorador/visor de archivos de mapas. Compruebe si puede explorar el archivo de mapa generado gcc.

amap: Una herramienta para analizar los archivos .MAP producidos por el compilador de Visual Studio de 32 bits e informar la cantidad de memoria utilizada por los datos y el código. Esta aplicación también puede leer y analizar archivos MAP producidos por los compiladores Xbox360, Wii y PS3.

+0

Gracias por la respuesta - mroe o menos lo que estaba buscando :) – peterchen

+0

¡Esto es asombroso! – Boinst

1

Sin sugerencia para una herramienta, pero una suposición acerca de una posible causa: ¿tiene habilitada la vinculación incremental? Esto puede causar la expansión durante las compilaciones posteriores ...

El enlazador eliminará los símbolos no utilizados si está compilando con/opt: ref, por lo que si está usando eso y no usa el enlace incremental, esperaría una expansión del binarios para ser solo un resultado del nuevo código real que se agrega. Hasta donde sé ... espero que ayude un poco.

+0

/opt: ref está habilitado, enlace incremental deshabilitado para la versión de lanzamiento (que se ve afectado). Pero sí, eso es lo primero que debe verificar – peterchen

2

El archivo de mapa debe tener el tamaño de cada sección, puede escribir una herramienta rápida para ordenar los símbolos por este tamaño. También hay una herramienta de línea de comandos que viene con MSVC (undname.exe) que puede usar para exigir los símbolos.

Una vez que tenga los símbolos ordenados por tamaño, puede generar esto semanalmente o diariamente como desee y comparar cómo el tamaño de cada símbolo ha cambiado con el tiempo.

El archivo de mapa solo de una sola compilación puede no decir mucho, pero un informe histórico de los archivos de mapas compilados puede contar un poco.

2

¿Ha intentado utilizar dumpbin.exe en sus archivos .obj?

cosas que debe buscar:

  • El uso de una gran cantidad de STL?
  • Muchas clases de C++ con métodos en línea?
  • Muchas constantes?

Si algo de lo anterior se aplica a usted. Verifique si tienen una amplia visibilidad, es decir, si se usan/ven en partes grandes de su aplicación.

-1

Las plantillas, macros, STL en general, utilizan una gran cantidad de espacio. Considerado como una gran biblioteca universal, BOOST agrega mucho espacio a los proyectos. BOOST_FOR_EACH es un ejemplo de esto. Sus cientos de líneas de código de plantilla, que podrían evitarse simplemente escribiendo un asa correcta de bucle, que en general es solo unas pocas teclas más.

Obtenga Visual AssistX para guardar la escritura, no usando plantillas. También considere poseer el código que usa. Las macros y la expansión de la función en línea no necesariamente aparecerán.

Además, si puedes, aléjate de la arquitectura DLL para vincular estáticamente todo en un ejecutable que se ejecuta en diferentes "modos". No hay absolutamente nada de malo en utilizar la misma imagen ejecutable tantas veces como desee simplemente pasando un parámetro de línea de comando diferente según lo que desee que haga.

Las DLL son el peor culpable de perder espacio y ralentizar el tiempo de ejecución de un proyecto. La gente piensa que ahorra espacio, cuando de hecho tienden a tener el efecto opuesto, a veces aumentando el tamaño del proyecto en diez veces. Además aumentan el intercambio. Use secciones de código fijo (sin sección de reubicación) para el rendimiento.

Cuestiones relacionadas