@@ -47,6 +47,10 @@ class TraceConverter:
47
47
zipinfo_central_info_match = re .compile (
48
48
"^\s*(\S+)$\s*offset of local header from start of archive:\s*(\d+)"
49
49
".*^\s*compressed size:\s+(\d+)" , re .M | re .S )
50
+ unreachable_line = re .compile ("((\d+ bytes in \d+ unreachable allocations)|" + \
51
+ "(\d+ bytes unreachable at [0-9a-f]+)|" + \
52
+ "(referencing \d+ unreachable bytes in \d+ allocation(s)?)|" + \
53
+ "(and \d+ similar unreachable bytes in \d+ allocation(s)?))" )
50
54
trace_lines = []
51
55
value_lines = []
52
56
last_frame = - 1
@@ -306,8 +310,11 @@ def ProcessLine(self, line):
306
310
revision_header = self .revision_line .search (line )
307
311
dalvik_jni_thread_header = self .dalvik_jni_thread_line .search (line )
308
312
dalvik_native_thread_header = self .dalvik_native_thread_line .search (line )
313
+ unreachable_header = self .unreachable_line .search (line )
309
314
if process_header or signal_header or abort_message_header or thread_header or \
310
- register_header or dalvik_jni_thread_header or dalvik_native_thread_header or revision_header :
315
+ register_header or dalvik_jni_thread_header or dalvik_native_thread_header or \
316
+ revision_header or unreachable_header :
317
+ ret = True
311
318
if self .trace_lines or self .value_lines :
312
319
self .PrintOutput (self .trace_lines , self .value_lines )
313
320
self .PrintDivider ()
@@ -330,6 +337,8 @@ def ProcessLine(self, line):
330
337
print dalvik_native_thread_header .group (1 )
331
338
if revision_header :
332
339
print revision_header .group (1 )
340
+ if unreachable_header :
341
+ print unreachable_header .group (1 )
333
342
return True
334
343
trace_line_dict = self .MatchTraceLine (line )
335
344
if trace_line_dict is not None :
@@ -448,6 +457,24 @@ def test_x86_registers(self):
448
457
def test_x86_64_registers (self ):
449
458
self .assert_register_matches ("x86_64" , example_crashes .x86_64 , '\\ b(rax|rsi|r8|r12|cs|rip)\\ b' )
450
459
460
+ class LibmemunreachablePatternTests (unittest .TestCase ):
461
+ def test_libmemunreachable (self ):
462
+ tc = TraceConverter ()
463
+ lines = example_crashes .libmemunreachable .split ('\n ' )
464
+
465
+ symbol .SetAbi (lines )
466
+ self .assertEquals (symbol .ARCH , "arm" )
467
+
468
+ tc .UpdateAbiRegexes ()
469
+ header_lines = 0
470
+ for line in lines :
471
+ tc .ProcessLine (line )
472
+ if re .search (tc .unreachable_line , line ) is not None :
473
+ header_lines += 1
474
+
475
+ self .assertEquals (header_lines , 3 )
476
+ self .assertEquals (len (tc .trace_lines ), 2 )
477
+ tc .PrintOutput (tc .trace_lines , tc .value_lines )
451
478
452
479
if __name__ == '__main__' :
453
480
unittest .main ()
0 commit comments