2008-09-07 20 views
57

Mi herramienta de construcción gcc produce un archivo .map. ¿Cómo visualizo el mapa de memoria gráficamente?¿Cómo podría visualizar gráficamente el diseño de la memoria desde un archivo .map?

+0

Estoy muy interesado en esta cuestión. Esperaba que obtuvieras algunas buenas respuestas. Pero tal vez a todos me guste solo subir tu pregunta y esperar :) Estén atentos ... Cheers - Prakash – prakash

+0

Dada una lista de tuplas (dirección, tipo de símbolo, nombre de símbolo) de un archivo de mapa, no es inmediatamente obvio qué tipos de gráficos podrían ser construido. ¿Podría revisar la pregunta para explicar lo que le gustaría visualizar? –

+1

intente este: http://www.absint.com/stackanalyzer/ no uso GCC así que realmente no puedo responder, pero pensé que el enlace podría ser lo que busca. – Mauro

Respuesta

23

Aquí está el comienzo de un script en Python. Carga el archivo de mapa en una lista de Secciones y Símbolos (la primera mitad). Luego renderiza el mapa usando HTML (o hace lo que quieras con las listas sections y symbols).

Puede controlar la secuencia de comandos mediante la modificación de estas líneas:

with open('t.map') as f: 
colors = ['9C9F84', 'A97D5D', 'F7DCB4', '5C755E'] 
total_height = 32.0 

map2html.py

from __future__ import with_statement 
import re 

class Section: 
    def __init__(self, address, size, segment, section): 
     self.address = address 
     self.size = size 
     self.segment = segment 
     self.section = section 
    def __str__(self): 
     return self.section+"" 

class Symbol: 
    def __init__(self, address, size, file, name): 
     self.address = address 
     self.size = size 
     self.file = file 
     self.name = name 
    def __str__(self): 
     return self.name 

#=============================== 
# Load the Sections and Symbols 
# 
sections = [] 
symbols = [] 

with open('t.map') as f: 
    in_sections = True 
    for line in f: 
     m = re.search('^([0-9A-Fx]+)\s+([0-9A-Fx]+)\s+((\[[ 0-9]+\])|\w+)\s+(.*?)\s*$', line) 
     if m: 
      if in_sections: 
       sections.append(Section(eval(m.group(1)), eval(m.group(2)), m.group(3), m.group(5))) 
      else: 
       symbols.append(Symbol(eval(m.group(1)), eval(m.group(2)), m.group(3), m.group(5))) 
     else: 
      if len(sections) > 0: 
       in_sections = False 


#=============================== 
# Gererate the HTML File 
# 

colors = ['9C9F84', 'A97D5D', 'F7DCB4', '5C755E'] 
total_height = 32.0 

segments = set() 
for s in sections: segments.add(s.segment) 
segment_colors = dict() 
i = 0 
for s in segments: 
    segment_colors[s] = colors[i % len(colors)] 
    i += 1 

total_size = 0 
for s in symbols: 
    total_size += s.size 

sections.sort(lambda a,b: a.address - b.address) 
symbols.sort(lambda a,b: a.address - b.address) 

def section_from_address(addr): 
    for s in sections: 
     if addr >= s.address and addr < (s.address + s.size): 
      return s 
    return None 

print "<html><head>" 
print " <style>a { color: black; text-decoration: none; font-family:monospace }</style>" 
print "<body>" 
print "<table cellspacing='1px'>" 
for sym in symbols: 
    section = section_from_address(sym.address) 
    height = (total_height/total_size) * sym.size 
    font_size = 1.0 if height > 1.0 else height 
    print "<tr style='background-color:#%s;height:%gem;line-height:%gem;font-size:%gem'><td style='overflow:hidden'>" % \ 
     (segment_colors[section.segment], height, height, font_size) 
    print "<a href='#%s'>%s</a>" % (sym.name, sym.name) 
    print "</td></tr>" 
print "</table>" 
print "</body></html>" 

Y aquí es una mala prestación del HTML que da salida:

Map

+0

Eso es genial Frank. – JeffV

+0

Gracias. Se puede hacer más preciso teniendo en cuenta la brecha de 1 píxel. Además, le gustaría hacer enlaces en este "mapa" a algún tipo de sección clave/diccionario en la página. Pero sí, esto podría ser útil. –

+0

¿Lo escribiste? Si es así, ¿escribió este guión para responder esta pregunta? o lo escribiste para tu uso regular? – claws

4

He escrito un programa C# para mostrar la información en un archivo de Mapa al ong con información que normalmente no está presente en el archivo del mapa (como símbolos estáticos siempre que pueda usar binutils). El código está disponible here. En resumen, analiza el archivo del mapa y también usa BINUTILS (si está disponible) para recopilar más información. Para ejecutarlo necesita descargar el código y ejecutar el proyecto en Visual Studio, busque la ruta del archivo de mapa y haga clic en Analyze.

Nota: Sólo funciona para GCC/LD mapa archivos

Captura de pantalla: [3]

+0

El solo hecho de vincular sus propias cosas es [no es una buena respuesta] (// stackoverflow.com/help/promotion). Una buena respuesta que involucra un recurso externo incluye las partes esenciales de la respuesta aquí para futuros usuarios, y hace referencia a lo siguiente: _ ¿De qué es esto de lo que estás hablando? ¿Dónde lo instalo? ¿Como lo instalo? ¿Cómo uso esto para resolver el ** problema exacto ** que tengo en mi pregunta? ¿Está afiliado a esta cosa de alguna forma o forma? _ Consulte: [¿Cómo puedo vincular a un recurso externo de una manera amigable con la comunidad?] (// meta.stackexchange.com/questions/94022) – Mogsdad

+0

Aceptar He hecho algunas edicionesMás allá de esto, no veo nada más que pueda agregar. * ¿De qué es esto de lo que estás hablando? * - Evidente: es un analizador/visor de archivos de mapas. * ¿Dónde/Cómo lo instalo? * - Windows, ejecute el proyecto usando Visual Studio * ¿Cómo uso esto para resolver el problema exacto que tengo en mi pregunta? * - Cargue el archivo del mapa, ejecute el software * ¿Está afiliado? con esto de alguna manera, forma o forma? * - Err, sí, lo escribí. – Sredni

+0

¿Esto también funcionará con 'mono'? – user1273684

Cuestiones relacionadas