Skip to content

Commit 871b0eb

Browse files
colincrossandroid-build-merger
authored andcommitted
Merge \"stack: support output from dumpsys meminfo --unreachable\"
am: 530c874 Change-Id: Ib11c0086f362d24594a6139044e663b7f4c4e9ea
2 parents 12d4bd3 + 530c874 commit 871b0eb

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

scripts/example_crashes.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,3 +185,17 @@
185185
#07 pc 000000000001d3eb /system/lib64/libc.so (__start_thread+11)
186186
#08 pc 00000000000138f5 /system/lib64/libc.so (__bionic_clone+53)
187187
"""
188+
189+
libmemunreachable = """
190+
Unreachable memory
191+
48 bytes in 2 unreachable allocations
192+
ABI: 'arm'
193+
194+
24 bytes unreachable at a11e6748
195+
and 24 similar unreachable bytes in 1 allocation
196+
contents:
197+
a11e6748: 63 6f 6d 2e 61 6e 64 72 6f 69 64 2e 73 79 73 74 com.android.syst
198+
a11e6758: 65 6d 75 69 00 00 00 00 emui....
199+
#00 pc 000076ae /system/lib/libcutils.so (set_process_name+45)
200+
#01 pc 000989d6 /system/lib/libandroid_runtime.so (android_os_Process_setArgV0(_JNIEnv*, _jobject*, _jstring*)+125)
201+
"""

scripts/stack_core.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class TraceConverter:
4747
zipinfo_central_info_match = re.compile(
4848
"^\s*(\S+)$\s*offset of local header from start of archive:\s*(\d+)"
4949
".*^\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)?))")
5054
trace_lines = []
5155
value_lines = []
5256
last_frame = -1
@@ -306,8 +310,11 @@ def ProcessLine(self, line):
306310
revision_header = self.revision_line.search(line)
307311
dalvik_jni_thread_header = self.dalvik_jni_thread_line.search(line)
308312
dalvik_native_thread_header = self.dalvik_native_thread_line.search(line)
313+
unreachable_header = self.unreachable_line.search(line)
309314
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
311318
if self.trace_lines or self.value_lines:
312319
self.PrintOutput(self.trace_lines, self.value_lines)
313320
self.PrintDivider()
@@ -330,6 +337,8 @@ def ProcessLine(self, line):
330337
print dalvik_native_thread_header.group(1)
331338
if revision_header:
332339
print revision_header.group(1)
340+
if unreachable_header:
341+
print unreachable_header.group(1)
333342
return True
334343
trace_line_dict = self.MatchTraceLine(line)
335344
if trace_line_dict is not None:
@@ -448,6 +457,24 @@ def test_x86_registers(self):
448457
def test_x86_64_registers(self):
449458
self.assert_register_matches("x86_64", example_crashes.x86_64, '\\b(rax|rsi|r8|r12|cs|rip)\\b')
450459

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)
451478

452479
if __name__ == '__main__':
453480
unittest.main()

0 commit comments

Comments
 (0)