¿Cómo podría mostrar gráficamente el diseño de la memoria desde un archivo .map?[cerrado]

StackOverflow https://stackoverflow.com/questions/48426

  •  09-06-2019
  •  | 
  •  

Pregunta

Mi cadena de herramientas de compilación gcc produce un archivo .map.¿Cómo visualizo el mapa de memoria gráficamente?

¿Fue útil?

Solución

Aquí están los inicios de un script en Python.Carga el archivo del mapa en una lista de Secciones y Símbolos (primera mitad).Luego representa el mapa usando HTML (o haz lo que quieras con el sections y symbols liza).

Puedes controlar el script modificando estas líneas:

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

mapa2html.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í hay una mala representación del HTML que genera:

Map

Otros consejos

Escribí un programa C# para mostrar la información en un archivo de mapa junto con información que normalmente no está presente en el archivo de mapa (como los símbolos estáticos proporcionados que puede usar). binutils).El código está disponible. aquí.En resumen, analiza el archivo de mapa y también usa BINUTILS (si está disponible) para recopilar más información.Para ejecutarlo, debe descargar el código y ejecutar el proyecto en Visual Studio, buscar la ruta del archivo del mapa y hacer clic. Analyze.

Nota:Sólo funciona para GCC/LD archivos de mapas

Captura de pantalla:[3]

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