forked from Github_Repos/cvw
		
	
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #! /usr/bin/python3
 | |
| import sys,os
 | |
| import matplotlib.pyplot as plt
 | |
| import matplotlib.animation as animation
 | |
| import matplotlib.ticker as ticker
 | |
| 
 | |
| # Argument Parsing
 | |
| if len(sys.argv) != 4:
 | |
|     sys.exit('Error analyzeTrace.py expects 3 args:\n <trace> <addresses> <labels>')
 | |
| traceFile = sys.argv[1]
 | |
| addressFile = sys.argv[2]
 | |
| labelFile = sys.argv[3]
 | |
| if not os.path.exists(traceFile):
 | |
|     sys.exit('Error trace file '+traceFile+'not found')
 | |
| if not os.path.exists(addressFile):
 | |
|     sys.exit('Error address file '+addressFile+'not found')
 | |
| if not os.path.exists(labelFile):
 | |
|     sys.exit('Error label file '+labelFile+'not found')
 | |
| 
 | |
| print('Loading labels')
 | |
| funcList=[]
 | |
| with open(addressFile, 'r') as addresses, open(labelFile, 'r') as labels: 
 | |
|     for address, label in zip(addresses, labels):
 | |
|         funcList.append([int(address.strip('\n'),16),label.strip('\n'),0])
 | |
| 
 | |
| def lookupAdr(address):
 | |
|     labelCount = len(funcList)
 | |
|     guessIndex = labelCount
 | |
|     guessAdr = funcList[guessIndex-1][0]
 | |
|     if address < funcList[0][0]:
 | |
|         return 0
 | |
|     while (address < guessAdr):
 | |
|         guessIndex-=1
 | |
|         if guessIndex == -1:
 | |
|             return 0
 | |
|         guessAdr=funcList[guessIndex][0]
 | |
|     funcList[guessIndex][2] += 1
 | |
|     #print(funcList[guessIndex][1])
 | |
|     return 1 
 | |
|                 
 | |
| print('Parsing trace')
 | |
| with open(traceFile, 'r') as trace:
 | |
|     iCount = 0
 | |
|     for l in trace:
 | |
|         lookupAdr(int(l.split(' ')[0],16))
 | |
|         iCount += 1
 | |
|         if (iCount % 1e5==0):
 | |
|             print('Reached '+str(iCount/1e6)+' million instructions')
 | |
| 
 | |
| print('Sorting by function frequency')
 | |
| funcListSorted = sorted(funcList, key=lambda labelEntry: -labelEntry[2])
 | |
| with open('traceAnalysis.txt','w') as outFile:
 | |
|     outFile.write('Virtual Address    \t'+('%-50s'%'Function')+'Occurences\n')
 | |
|     for labelEntry in funcListSorted:
 | |
|         addr = '%x' % labelEntry[0]
 | |
|         outFile.write(addr+'\t'+('%-50s' % labelEntry[1])+str(labelEntry[2])+'\n')
 | |
| print('Logged results to traceAnalysis.txt')
 |