2008-09-07 54 views
57

我的gcc構建工具鏈生成一個.map文件。如何以圖形方式顯示內存映射?如何以圖形方式顯示.map文件中的內存佈局?

+0

我對這個問題很感興趣。希望你會得到一些不錯的答案。但是,也許每個人都喜歡我,只是提出你的問題並等待:)敬請關注 - Prakash – prakash 2008-09-09 12:13:28

+0

如果給出了地圖文件中的(地址,符號類型,符號名稱)元組列表,那麼不清楚哪些類型的圖可能是建。你能否修改這個問題來解釋你想要展示的內容? – 2008-09-09 13:47:11

+1

試試這個:http://www.absint.com/stackanalyzer/我不使用GCC所以我真的不能回答,但認爲鏈接可能是你以後的。 – Mauro 2008-09-10 12:28:51

回答

23

這是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

4

我已經寫了一個C#程序來在地圖文件al中顯示信息與通常不存在於地圖文件中的信息(如提供的靜態符號一起提供,您可以使用binutils)。該代碼可用here。簡而言之,它解析映射文件,並使用BINUTILS(如果可用)收集更多信息。要運行它,您需要下載代碼並在Visual Studio下運行該項目,瀏覽至地圖文件路徑並單擊Analyze

注:僅適用於GCC/LD地圖文件

截圖: [3]

相關問題