Pregunta

Después de tres años trabajando en un proyecto de C ++, el ejecutable ha crecido hasta 4 MB. Me gustaría ver a dónde va todo este espacio. ¿Existe una herramienta que podría informar de lo que los cerdos más grande de espacio son? Sería bueno para ver el tamaño de la clase (todas las funciones en una clase), por la plantilla (todas las instancias), y por la biblioteca (cuánto pertenece a la biblioteca estándar de C y STL? Cuánto para cada biblioteca en el exe?)

Edit: Tenga en cuenta, estoy utilizando Visual C ++ en Windows

.
¿Fue útil?

Solución

En Linux , puede utilizar nm para mostrar todos los símbolos en el ejecutable y clasificarlos en orden inverso por tamaño:

$ nm -CSr --size-sort <exe>

Opciones:

  • -C demangling C nombres ++.
  • -S muestra el tamaño de los símbolos.
  • --size-sort ordena símbolos por tamaño.
  • -r invierte la especie.

Si usted quiere conseguir los resultados por espacio de nombres o por clase, sólo puede grep la salida de 'namespace::', 'namespace::class_name::', etc. .

Si sólo desea ver los símbolos que se definen en el ejecutable (no los definidos en otros lugares, como en bibliotecas) a continuación, añadir --defined-only. La clasificación por tamaño debe hacerse cargo de esto, sin embargo, ya símbolos no definidos no van a tener un tamaño.

Para Windows , que aún debe ser capaz de utilizar dumpbin en sus archivos binarios, ya que /SYMBOLS soportes binarios COFF . Puede instalar <=> a través de cygwin, o se puede copiar sus ventanas ejecutables a una máquina Linux y ejecutar <=> en él allí.

También puede probar <=> , que vuelca información sobre un binario en Windows. Puede obtener información sobre los símbolos con el interruptor <=>, pero no se ve como que proporciona directamente la información sobre su tamaño.

Otros consejos

En Windows en Visual Studio compila, esta información se encuentra en su archivo .map (que será cerca de la .pdb).

AÑADIDO : para convertir los nombres representativos se encuentran en el archivo .map a algo más legible, se puede utilizar el undname.exe utilidad incluida con Visual Studio. Se acepta nombres individuales en la línea de comandos o se puede alimentar un archivo .map.

Por ejemplo,

Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of "?push_back@?$mini_vector@U?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@$05@@QAAXABU?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@@Z" is 

"public: void __cdecl mini_vector<struct Math::Point<struct Math::FixedPoint<14,int> >,6>::push_back(struct Math::Point<struct Math::FixedPoint<14,int> > const &)"

No pude conseguir nm a trabajar para mí, pero se las arregló para encontrar una herramienta útil llamada Sizer . Se lee la información de depuración creado por Visual Studio utilizando las bibliotecas de interfaz de depuración de acceso. Es bastante sencillo de usar, como se describe en el sitio.

  1. compilar con la depuración de información en la base de datos de programa (.pdb)
  2. Sizer Ejecutar desde la línea de comandos, por ejemplo, Sizer.exe <path-to-exe-file>. La salida irá a la salida estándar por lo que probablemente querrá volver a dirigir a un archivo.

Los tamaños de código se dividen en diferentes secciones y se agrupan por función, los datos, clase, etc., cada sección ordena en orden descendente de tamaño de código.

No basta con ver el código -. Recursos pueden causar fácilmente el crecimiento de varios megabytes

Obtener un mapa de enlaces, o utilizar dumpbin para obtener una lista de símbolos y tamaños.

Lo más probable es que hay un montón de cosas por ser arrastrado por que ni estrictamente necesario.

AÑADIDO: ¿Recibió una respuesta satisfactoria? Me di cuenta de que hay dos formas en que se acercan a problemas como éste:

  • Obtener mediciones antes de hacer nada.
  • Sólo tienes que encontrar algo grande que no necesitan, arrancarlo, y repetir hasta que no pueden.

En lo personal prefiero este último -. Obtiene resultados más rápidos

Usted dice que la aplicación es de 4 MB. Supongamos que el verdadero tamaño necesario es de 1 MB (o alguna tamaño). Eso significa que si tienes que elegir una rutina al azar del archivo de mapa, que es el 75% de probabilidades de ser algo que no es necesario. Para saber cuál es la causa que sea incluido, y ver si realmente lo necesita.

En el ejemplo que dio, que viste una clase que envuelve independientes del dispositivo-mapas de bits. Se podía encontrar instancias de esa clase en su aplicación, y posiblemente reemplazarlos con mapas de bits básicos de Win32. Sería menos bonita, sino para salvar pegotes de tamaño aplicación.

A continuación, seguir haciéndolo. Cada pedazo grande a deshacerse de hace que las piezas restantes tienen un mayor porcentaje de la aplicación, ya que la aplicación se ha reducido, pero las piezas no tienen. Eso hace que sean más fáciles de encontrar en el archivo de mapa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top