当前位置:  开发笔记 > 编程语言 > 正文

如何以图形方式显示.map文件中的内存布局?

如何解决《如何以图形方式显示.map文件中的内存布局?》经验,为你挑选了2个好方法。

我的gcc构建工具链生成一个.map文件.如何以图形方式显示内存映射?



1> Frank Kruege..:

这是Python中脚本的开头.它将地图文件加载到Sections和Symbols列表中(上半部分).然后,它使用HTML呈现地图(或使用sectionssymbols列表执行任何操作).

您可以通过修改以下行来控制脚本:

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 ""
print "  "
print ""
print ""
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 ""
print "
" % \ (segment_colors[section.segment], height, height, font_size) print "%s" % (sym.name, sym.name) print "
" print ""

这是对它输出的HTML的糟糕渲染:

地图



2> 小智..:

我编写了一个C#程序来显示Map文件中的信息以及地图文件中通常不存在的信息(如您可以使用的静态符号binutils).代码可在此处获得.简而言之,它解析映射文件,并使用BINUTILS(如果可用)收集更多信息.要运行它,您需要下载代码并在visual studio下运行项目,浏览到地图文件路径并单击Analyze.

注意:仅适用于GCC/LD地图文件

截图:[3]

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有