64 votes

Comment pourrais-je afficher graphiquement la disposition de la mémoire à partir d'un fichier .map ?

Ma chaîne d'outils de construction gcc produit un fichier .map. Comment puis-je afficher la carte mémoire sous forme graphique ?

1 votes

Cette question m'intéresse vraiment. J'espérais que vous auriez de bonnes réponses. Mais peut-être que tout le monde comme moi ne fait qu'upvoter votre question et attend :) Restez à l'écoute. Cheers - Prakash

0 votes

Étant donné une liste de tuples (adresse, type de symbole, nom de symbole) provenant d'un fichier map, il n'est pas immédiatement évident de savoir quels types de graphes pourraient être construits. Pourriez-vous réviser la question pour expliquer ce que vous aimeriez visualiser ?

1 votes

Essayez celui-ci : absint.com/stackanalyzer Je n'utilise pas GCC donc je ne peux pas vraiment répondre mais j'ai pensé que le lien pourrait être ce que vous recherchez.

28voto

Frank Krueger Points 27508

Voici les prémices d'un script en Python. Il charge le fichier de la carte dans une liste de sections et de symboles (première moitié). Il rend ensuite la carte en utilisant HTML (ou en faisant ce que vous voulez avec l'attribut sections y symbols listes).

Vous pouvez contrôler le script en modifiant ces lignes :

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>"

Et voici un mauvais rendu du HTML qu'il produit :

Map

0 votes

Merci. On peut la rendre plus précise en prenant en compte l'écart d'un pixel. De plus, il faudrait créer des liens dans cette "carte" vers une sorte de section clé/dictionnaire sur la page. Mais oui, cela pourrait être utile.

0 votes

L'avez-vous écrit. Si oui, vous avez écrit ce script pour répondre à cette question ? ou vous l'avez écrit pour votre utilisation régulière ?

0 votes

@Frank Krueger, Je n'ai jamais utilisé python auparavant, je viens d'installer la dernière version v.3.2 ou Windows et je n'ai pas pu exécuter le script ci-dessus. Quelqu'un pourrait-il s'il vous plaît corriger le script, ce ne sont probablement que des problèmes mineurs.

8voto

Sredni Points 410

J'ai écrit un programme C# pour afficher les informations d'un fichier Map ainsi que des informations qui ne sont généralement pas présentes dans le fichier Map (comme les symboles statiques fournis par l'utilisateur). binutils ). Le code est disponible aquí . En bref, il analyse le fichier de la carte et utilise aussi BINUTILS (si disponible) pour recueillir plus d'informations. Pour l'exécuter, vous devez télécharger le code et exécuter le projet sous visual studio, naviguer jusqu'au chemin du fichier de la carte et cliquer sur Analyze .

Remarque : ne fonctionne que pour GCC/LD les fichiers de cartes

Capture d'écran : [ 3

1voto

ramayac Points 1830

Je pense que vous cherchez quelque chose de similaire à este n'est-ce pas ?
Je ne suis pas sûr qu'il en existe un pour Linux, mais je pense que vous pourriez faire un "analyseur simple script".
L'idée de base serait de pouvoir extraire d'un fichier .map donné, l'adresse d'un symbole. Ainsi, dans ce script, vous pourriez charger le fichier .map et écrire le nom d'une variable et lire le contenu qui lui est associé.
Voilà, c'est mon petit conseil, j'espère que ça vous aidera.

Mise à jour : Je vous ai trouvé une application Windows appelée Stackanalyzer mais encore une fois, je ne suis pas sûr que cela réponde à vos besoins. Bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X