Análisis de archivos de mapas

0

He estado escribiendo un software para un controlador integrado en C ++. Me he dado cuenta que tengo algunos problemas con la memoria RAM (probablemente me haya quedado sin el memoria disponible). He decidido inspeccionar un archivo de mapa pero he encontrado que No puedo encontrar varias colas en el archivo de mapa. Estas colas están definidas como atributos privados de algún objeto en mi código fuente. ¿Alguien sabe por qué? Los atributos privados no son visibles en el archivo de mapa? Gracias por cualquier idea.

    
pregunta Steve

2 respuestas

4

Tenga en cuenta que las "variables automáticas" en C no persisten fuera de las invocaciones individuales de una subrutina, y generalmente se asignan dinámicamente en la pila. Por lo tanto, no se muestran en un archivo de mapa porque no existen en ese nivel.

Sin embargo, consumen espacio de pila. Debe asegurarse de que la cantidad de memoria disponible para la pila sea suficiente para el agrupamiento de subrutinas en el peor de los casos que se producirán en su proyecto. Eso puede ser difícil de saber. Algunas suites de desarrollo tienen herramientas para ayudar con eso.

Un truco para tener una idea del uso de la pila es cargar toda el área de la pila con un patrón de datos específico. Deje que el sistema se ejecute mientras espera ejercitar todos los casos. Luego mire el área de la pila con un depurador y vea qué tan profundo llegó al encontrar dónde se sobrescribió el patrón original. Tenga en cuenta que esto solo le muestra la profundidad de la pila durante la prueba, no la profundidad que puede alcanzar. Este método depende de qué tan bien ejerció el sistema durante la prueba.

Algunos procesadores, como el PIC 24 y la serie dsPIC de Microchip, tienen un medio para que el hardware detecte una escritura cerca del final de la pila. Esto se hace con el registro de límite de pila. Se genera una captura si los datos de la pila se escriben más allá del límite.

Añadido sobre "colas"

Como Dave Tweed señaló en un comentario, algo llamado "cola" puede no asignarse dinámicamente en la pila. En ese caso, reside permanentemente en la memoria.

Sin embargo, algunas cadenas de herramientas agrupan toda la memoria privada pero estáticamente asignada de un módulo como un número en el archivo de mapa. En realidad, esto sería por módulo por sección , pero normalmente toda esa memoria estaría en una sola sección a menos que se esforzara por definirlo de otra manera.

Si su cadena de herramientas hace esto, hay varias opciones para hacer que el tamaño de las variables privadas específicas se deletree en el archivo del vinculador:

  1. Declare que la variable está en una sección especial. Todas las cadenas de herramientas que he visto le mostrarán los tamaños de las secciones asignadas estáticamente de una forma u otra.

  2. Declara la variable global. Esta es una mala práctica de software si la variable solo tiene acceso dentro del módulo, por lo que lo hace temporalmente solo para ver el resultado en el archivo de mapa.

  3. Algunos sistemas tienen una configuración que hace que las variables privadas pero asignadas estáticamente se muestren individualmente en el archivo de mapa.

respondido por el Olin Lathrop
0

Las composiciones aparecen en diferentes lugares de lo que cabría esperar. La visibilidad definida en el código no tiene efecto en eso. Los datos privados aparecen en el archivo de enlace al igual que cualquier otro dato.

Tenemos una construcción de sistema estática (sin gestión de memoria dinámica), por lo que en el archivo de mapa, toda la RAM está asignada por el objeto "madre" que tiene todas las composiciones de los otros objetos.

Las clases obtienen su propio uso de código, pero no el uso de RAM a excepción de las variables estáticas.

El uso total de RAM se suele dar correctamente, al descubrir qué objeto usa cuánta RAM es un poco difícil. He utilizado las herramientas del depurador de Lauterbach para eso en el pasado, que es capaz de generar un mapa del uso de RAM a los objetos.

    
respondido por el Arsenal

Lea otras preguntas en las etiquetas