Skip to content

Commit 8967b52

Browse files
committed
crash_log_parser review comment fixes
1 parent 96d900c commit 8967b52

File tree

1 file changed

+75
-132
lines changed

1 file changed

+75
-132
lines changed

tools/debug_tools/crash_log_parser/crash_log_parser.py

Lines changed: 75 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,22 @@
2020

2121
from __future__ import print_function
2222
from os import path
23-
import re, bisect
23+
import re
24+
import bisect
2425
from subprocess import check_output
2526
import sys
2627

2728
#arm-none-eabi-nm -nl <elf file>
28-
NM_EXEC = "arm-none-eabi-nm"
29-
OPT = "-nlC"
30-
ptn = re.compile("([0-9a-f]*) ([Tt]) ([^\t\n]*)(?:\t(.*):([0-9]*))?")
31-
fnt = None
32-
fnt = ""
29+
_NM_EXEC = "arm-none-eabi-nm"
30+
_OPT = "-nlC"
31+
_PTN = re.compile("([0-9a-f]*) ([Tt]) ([^\t\n]*)(?:\t(.*):([0-9]*))?")
3332

3433
class ElfHelper(object):
35-
def __init__(self, p,m):
36-
if path.isfile(p):
37-
elf_path = p
38-
if path.isfile(m):
39-
map_path = m
40-
41-
op = check_output([NM_EXEC, OPT, elf_path])
42-
map_file = open(map_path)
34+
def __init__(self, elf_file,map_file):
35+
36+
op = check_output([_NM_EXEC, _OPT, elf_file.name])
4337
self.maplines = map_file.readlines()
44-
self.matches = ptn.findall(op)
38+
self.matches = _PTN.findall(op)
4539
self.addrs = [int(x[0],16) for x in self.matches]
4640

4741
def function_addrs(self):
@@ -52,19 +46,7 @@ def function_name_for_addr(self, addr):
5246
funcname = self.matches[i-1][2]
5347
return funcname
5448

55-
def file_name_for_function_name(self, funcname):
56-
for eachline in self.maplines:
57-
result = eachline.find(funcname)
58-
if(result != -1):
59-
break
60-
toks = eachline.split()
61-
if(len(toks) <= 0):
62-
print("WARN: Unable to find %s in map file"%(str(funcname)))
63-
return ("%s [FUNCTION]"%(str(funcname)))
64-
else:
65-
return toks[-1]
66-
67-
def parseHFSR(hfsr):
49+
def print_HFSR_info(hfsr):
6850
if(hfsr != 0):
6951
if( int(hfsr,16) & 0x80000000 ):
7052
print("\t\tDebug Event Occured")
@@ -73,7 +55,7 @@ def parseHFSR(hfsr):
7355
if( int(hfsr,16) & 0x2 ):
7456
print("\t\tVector table read fault has occurred")
7557

76-
def parseMMFSR(mmfsr,mmfar):
58+
def print_MMFSR_info(mmfsr,mmfar):
7759
if(mmfsr != 0):
7860
if( int(mmfsr,16) & 0x20 ):
7961
print("\t\tA MemManage fault occurred during FP lazy state preservation")
@@ -89,7 +71,7 @@ def parseMMFSR(mmfsr,mmfar):
8971
if( int(mmfsr,16) & 0x1 ):
9072
print("\t\tMPU or Execute Never (XN) default memory map access violation on an instruction fetch has occurred")
9173

92-
def parseBFSR(bfsr,bfar):
74+
def print_BFSR_info(bfsr,bfar):
9375
if(bfsr != 0):
9476
if( int(bfsr,16) & 0x20 ):
9577
print("\t\tA bus fault occurred during FP lazy state preservation")
@@ -107,7 +89,7 @@ def parseBFSR(bfsr,bfar):
10789
if( int(bfsr,16) & 0x1 ):
10890
print("\t\tA bus fault on an instruction prefetch has occurred")
10991

110-
def parseUFSR(ufsr):
92+
def print_UFSR_info(ufsr):
11193
if(ufsr != 0):
11294
if( int(ufsr,16) & 0x200 ):
11395
print("\t\tDivide by zero error has occurred")
@@ -122,156 +104,117 @@ def parseUFSR(ufsr):
122104
if( int(ufsr,16) & 0x1 ):
123105
print("\t\tThe processor has attempted to execute an undefined instruction")
124106

125-
def parseCPUID(cpuid):
107+
def print_CPUID_info(cpuid):
126108
if( ( ( int(cpuid,16) & 0xF0000 ) >> 16 ) == 0xC ):
127109
print("\t\tProcessor Arch: ARM-V6M")
128110
else:
129111
print("\t\tProcessor Arch: ARM-V7M or above")
130112

131113
print("\t\tProcessor Variant: %X"%(( ( int(cpuid,16) & 0xFFF0 ) >> 4 )))
132-
133114

134-
def main(input):
135-
global fnt, pc_val, pc_name, lr_val, lr_name, sp_val, hfsr_val, mmfsr_val, ufsr_val, bfsr_val, cpuid_val, mmfar_val, bfar_val
136-
start_parsing = False
115+
def parse_line_for_register(line):
116+
line = re.findall(r"[\w']+", line)
117+
line = [x.strip() for x in line if x != '']
118+
tag, register_val = line
119+
return register_val
120+
121+
def main(crash_log,elfhelper):
122+
global pc_val, pc_name, lr_val, lr_name, sp_val, hfsr_val, mmfsr_val, ufsr_val, bfsr_val, cpuid_val, mmfar_val, bfar_val
137123
mmfar_val = 0
138124
bfar_val = 0
139-
crash_file = open(input)
140-
lines = crash_file.readlines()
125+
126+
lines = crash_log.readlines()
141127

142128
cnt = 0
143129
for eachline in lines:
144-
idx = eachline.find("MbedOS Fault Handler")
145-
if(-1 != idx):
130+
if "++ MbedOS Fault Handler ++" in eachline:
146131
break
147-
cnt=cnt+1
148-
149-
if(idx == -1):
132+
else:
150133
print("ERROR: Unable to find \"MbedOS Fault Handler\" header")
151134
return
152135

153-
154-
print("\n\nParsed Crash Info:")
155-
for i in range(cnt,len(lines)):
156-
eachline=lines[i]
157-
if(-1 != eachline.find("--- MbedOS Fault Handler ---")):
136+
for eachline in lines:
137+
if("-- MbedOS Fault Handler --" in eachline):
158138
break
159139

160-
if(eachline.startswith("PC")):
161-
l = re.findall(r"[\w']+", eachline)
162-
l = [x.strip() for x in l if x != '']
163-
tag, pc_val = l
164-
pc_name = fnt.function_name_for_addr(int(pc_val,16))
140+
elif(eachline.startswith("PC")):
141+
pc_val = parse_line_for_register(eachline)
142+
pc_name = elfhelper.function_name_for_addr(int(pc_val,16))
165143

166-
if(eachline.startswith("LR")):
167-
l = re.findall(r"[\w']+", eachline)
168-
l = [x.strip() for x in l if x != '']
169-
tag, lr_val = l
170-
lr_name = fnt.function_name_for_addr(int(lr_val,16))
144+
elif(eachline.startswith("LR")):
145+
lr_val = parse_line_for_register(eachline)
146+
lr_name = elfhelper.function_name_for_addr(int(lr_val,16))
171147

172-
if(eachline.startswith("SP")):
173-
l = re.findall(r"[\w']+", eachline)
174-
l = [x.strip() for x in l if x != '']
175-
tag, sp_val = l
148+
elif(eachline.startswith("SP")):
149+
sp_val = parse_line_for_register(eachline)
176150

177-
if(eachline.startswith("HFSR")):
178-
l = re.findall(r"[\w']+", eachline)
179-
l = [x.strip() for x in l if x != '']
180-
tag, hfsr_val = l
151+
elif(eachline.startswith("HFSR")):
152+
hfsr_val = parse_line_for_register(eachline)
181153

182-
if(eachline.startswith("MMFSR")):
183-
l = re.findall(r"[\w']+", eachline)
184-
l = [x.strip() for x in l if x != '']
185-
tag, mmfsr_val = l
154+
elif(eachline.startswith("MMFSR")):
155+
mmfsr_val = parse_line_for_register(eachline)
186156

187-
if(eachline.startswith("BFSR")):
188-
l = re.findall(r"[\w']+", eachline)
189-
l = [x.strip() for x in l if x != '']
190-
tag, bfsr_val = l
157+
elif(eachline.startswith("BFSR")):
158+
bfsr_val = parse_line_for_register(eachline)
191159

192-
if(eachline.startswith("UFSR")):
193-
l = re.findall(r"[\w']+", eachline)
194-
l = [x.strip() for x in l if x != '']
195-
tag, ufsr_val = l
160+
elif(eachline.startswith("UFSR")):
161+
ufsr_val = parse_line_for_register(eachline)
196162

197-
if(eachline.startswith("CPUID")):
198-
l = re.findall(r"[\w']+", eachline)
199-
l = [x.strip() for x in l if x != '']
200-
tag, cpuid_val = l
163+
elif(eachline.startswith("CPUID")):
164+
cpuid_val = parse_line_for_register(eachline)
201165

202-
if(eachline.startswith("MMFAR")):
203-
l = re.findall(r"[\w']+", eachline)
204-
l = [x.strip() for x in l if x != '']
205-
tag, mmfar_val = l
166+
elif(eachline.startswith("MMFAR")):
167+
mmfar_val = parse_line_for_register(eachline)
206168

207-
if(eachline.startswith("BFAR")):
208-
l = re.findall(r"[\w']+", eachline)
209-
l = [x.strip() for x in l if x != '']
210-
tag, bfar_val = l
211-
169+
elif(eachline.startswith("BFAR")):
170+
bfar_val = parse_line_for_register(eachline)
171+
172+
print("\n\nCrash Info:")
212173
print("\tCrash location = %s [%s] (based on PC value)"%(pc_name.strip(),str(pc_val)))
213174
print("\tCaller location = %s [%s] (based on LR value)"%(lr_name.strip(),str(lr_val)))
214175
print("\tStack Pointer at the time of crash = [%s]"%(str(sp_val)))
215176

216-
print("\tTarget/Fault Info:")
217-
parseCPUID(cpuid_val)
218-
parseHFSR(hfsr_val)
219-
parseMMFSR(mmfsr_val,mmfar_val)
220-
parseBFSR(bfsr_val,bfar_val)
221-
parseUFSR(ufsr_val)
222-
223-
print("\nDone parsing...")
177+
print("\tTarget and Fault Info:")
178+
print_CPUID_info(cpuid_val)
179+
print_HFSR_info(hfsr_val)
180+
print_MMFSR_info(mmfsr_val,mmfar_val)
181+
print_BFSR_info(bfsr_val,bfar_val)
182+
print_UFSR_info(ufsr_val)
224183

225184

226185
if __name__ == '__main__':
227186
import argparse
228187

229-
parser = argparse.ArgumentParser(
230-
description='Analyse mbed-os crash log')
231-
188+
parser = argparse.ArgumentParser(description='Analyse mbed-os crash log. This tool requires arm-gcc binary utilities to be available in current path as it uses \'nm\' command')
232189
# specify arguments
233-
parser.add_argument('-i','--input', metavar='<path to input file with crash log output>', type=str,
190+
parser.add_argument('-i','--input', metavar='<path to input file with crash log output>', type=argparse.FileType('rb', 0), required=True,
234191
help='path to input file')
235-
parser.add_argument('-e','--elfpath', metavar='<module or elf file path>', type=str,
192+
parser.add_argument('-e','--elfpath', metavar='<module or elf file path>', type=argparse.FileType('rb', 0), required=True,
236193
help='path to elf file')
237-
parser.add_argument('-m','--mappath', metavar='<map file path>', type=str,
194+
parser.add_argument('-m','--mappath', metavar='<map file path>', type=argparse.FileType('rb', 0), required=True,
238195
help='path to map file')
239196

240197
# get and validate arguments
241198
args = parser.parse_args()
242199

243-
p = args.elfpath
244-
m = args.mappath
245-
i = args.input
246-
if(p == None or m == None or i == None):
247-
print("Invalid arguments, exiting")
248-
parser.print_usage()
249-
sys.exit(1)
250-
251-
if not path.exists(p):
252-
print("Elf path %s does not exist"%(str(p)))
253-
parser.print_usage()
254-
sys.exit(1)
255-
256-
if not path.exists(m):
257-
print("Map path %s does not exist"%(str(m)))
258-
parser.print_usage()
259-
sys.exit(1)
260-
261-
if not path.exists(i):
262-
print("Input crash log path %s does not exist"%(str(i)))
263-
parser.print_usage()
264-
sys.exit(1)
200+
elf_file = args.elfpath
201+
map_file = args.mappath
202+
input_crash_log = args.input
265203

266204
print("Inputs:")
267-
print("\tCrash Log: %s"%(i))
268-
print("\tElf Path: %s"%(p))
269-
print("\tMap Path: %s"%(m))
205+
print("\tCrash Log: %s"%(input_crash_log.name))
206+
print("\tElf Path: %s"%(elf_file.name))
207+
print("\tMap Path: %s"%(map_file.name))
270208

271-
fnt = ElfHelper(p,m)
209+
elfhelper = ElfHelper(elf_file,map_file)
272210

273211
# parse input and write to output
274-
main(i)
212+
main(input_crash_log,elfhelper)
213+
214+
#close all files
215+
elf_file.close()
216+
map_file.close()
217+
input_crash_log.close()
275218

276219

277220

0 commit comments

Comments
 (0)