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

How could I graphically display the memory layout from a .map file? [closed]

提问人:JeffV 提问时间:9/7/2008 最后编辑:CommunityJeffV 更新时间:9/14/2023 访问量:26770

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

5年前关闭。

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

C++ C 链接器

评论

1赞 prakash 9/9/2008
我对这个问题很感兴趣。希望你能得到一些好的答案。但也许每个人都像我一样,只对你的问题投赞成票,然后等待:)敬请关注..干杯 - 普拉卡什
0赞 David Joyner 9/9/2008
给定地图文件中的(地址、符号类型、符号名称)元组列表,可以构造哪些类型的图形并不明显。你能修改一下问题来解释你想想象什么吗?
1赞 Mauro 9/10/2008
试试这个: absint.com/stackanalyzer 我不使用 GCC,所以我真的无法回答,但我认为该链接可能就是您想要的。
0赞 Jay M 6/27/2022
我不明白为什么关闭它。没有评论表明问题缺乏重点,而且问题非常具体。“如何以图形方式查看地图文件”。这个问题应该重新讨论。
0赞 Jay M 6/27/2022
由于问题已关闭,我无法添加此答案,但此工具可以完成这项工作:sikorskiy.net/info/prj/amap

答:

29赞 Frank Krueger 9/22/2008 #1

这是 Python 脚本的开头。它将地图文件加载到截面和符号列表(前半部分)中。然后,它使用 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 "<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>"

这是它输出的 HTML 的糟糕呈现:

Map

评论

0赞 Frank Krueger 9/27/2008
谢谢。通过考虑 1 个像素的间隙,可以使它更准确。此外,您可能希望在此“映射”中链接到页面上的某种键/字典部分。但是,是的,这可能很有用。
0赞 claws 3/24/2010
是你写的吗?如果是这样,你写了这个脚本来回答这个问题?还是你写的是为了你的日常使用?
0赞 theAlse 8/2/2011
@Frank克鲁格,我以前从未使用过python,我刚刚安装了最新版本v.3.2或Windows,无法运行上述脚本。有人可以修复脚本吗,这可能只是小问题。
0赞 Timmmm 10/21/2016
不幸的是,在我的地图文件上根本不起作用。.map 格式似乎不是很易于计算机阅读,这无济于事。
0赞 Nerf Herder 1/5/2017
这似乎使用了 python 的 2.4 之前版本。我尝试在 Python 3.x 上使用它,不得不在 print 语句中添加 parens,但后来它被挂在排序函数上,使用 lambda 函数,它需要一个关键参数。我现在对python和lambdas还不够了解,无法超越它。
8赞 Sredni 3/9/2016 #2

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

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

截图: [3]

评论

1赞 Mogsdad 3/10/2016
仅仅链接到你自己的东西并不是一个好的答案。一个涉及异地资源的好答案包括此处为未来用户提供的答案的基本部分,并引用以下内容:你在说什么东西?我在哪里安装它?如何安装?我如何使用这个东西来解决我的问题中的确切问题?你是否以任何方式、形状或形式与这个东西有联系?请参阅:如何以社区友好的方式链接到外部资源?
0赞 Sredni 3/10/2016
好的,我做了一些编辑。除此之外,我看不到任何其他可以添加的内容。 你在说什么东西? - 不言而喻 - 它是一个地图文件解析器/查看器。在哪里/如何安装它?- Windows,使用 Visual Studio 运行项目 我该如何使用这个东西来解决我的问题中的确切问题? - 加载地图文件,运行软件 你以任何方式、形状或形式与这个东西有联系吗? - 呃,是的,我写的。
0赞 user1273684 1/26/2018
这也适用于吗?mono
0赞 Sredni 1/28/2018
可能,但我没有尝试过。主要的外部依赖项是 ObjectListView,根据他们的常见问题解答,它主要适用于 Mono。
2赞 Ashley Duncan 5/3/2018
不管其他人的评论如何,我喜欢这个工具。我现在已经用过它好几次了,它可以在几秒钟内下载、构建和工作!