From 21b2ea80f7b48f91cc823b133a5c3978b1bb6742 Mon Sep 17 00:00:00 2001 From: ishell Date: Thu, 5 Feb 2015 03:47:02 -0800 Subject: [PATCH] Grokdump workaround for different layout of *_LIST structures written to minidumps on Mac. Review URL: https://codereview.chromium.org/902853002 Cr-Commit-Position: refs/heads/master@{#26456} --- tools/grokdump.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tools/grokdump.py b/tools/grokdump.py index 5a5cf4ba68..9d7fe16537 100755 --- a/tools/grokdump.py +++ b/tools/grokdump.py @@ -434,6 +434,12 @@ MINIDUMP_MEMORY_LIST = Descriptor([ ("ranges", lambda m: MINIDUMP_MEMORY_DESCRIPTOR.ctype * m.range_count) ]) +MINIDUMP_MEMORY_LIST_Mac = Descriptor([ + ("range_count", ctypes.c_uint32), + ("junk", ctypes.c_uint32), + ("ranges", lambda m: MINIDUMP_MEMORY_DESCRIPTOR.ctype * m.range_count) +]) + MINIDUMP_MEMORY_LIST64 = Descriptor([ ("range_count", ctypes.c_uint64), ("base_rva", ctypes.c_uint64), @@ -455,6 +461,12 @@ MINIDUMP_THREAD_LIST = Descriptor([ ("threads", lambda t: MINIDUMP_THREAD.ctype * t.thread_count) ]) +MINIDUMP_THREAD_LIST_Mac = Descriptor([ + ("thread_count", ctypes.c_uint32), + ("junk", ctypes.c_uint32), + ("threads", lambda t: MINIDUMP_THREAD.ctype * t.thread_count) +]) + MINIDUMP_VS_FIXEDFILEINFO = Descriptor([ ("dwSignature", ctypes.c_uint32), ("dwStrucVersion", ctypes.c_uint32), @@ -489,6 +501,12 @@ MINIDUMP_MODULE_LIST = Descriptor([ ("modules", lambda t: MINIDUMP_RAW_MODULE.ctype * t.number_of_modules) ]) +MINIDUMP_MODULE_LIST_Mac = Descriptor([ + ("number_of_modules", ctypes.c_uint32), + ("junk", ctypes.c_uint32), + ("modules", lambda t: MINIDUMP_RAW_MODULE.ctype * t.number_of_modules) +]) + MINIDUMP_RAW_SYSTEM_INFO = Descriptor([ ("processor_architecture", ctypes.c_uint16) ]) @@ -570,6 +588,9 @@ class MinidumpReader(object): DebugPrint(self.exception_context) elif d.stream_type == MD_THREAD_LIST_STREAM: thread_list = MINIDUMP_THREAD_LIST.Read(self.minidump, d.location.rva) + if ctypes.sizeof(thread_list) + 4 == d.location.data_size: + thread_list = MINIDUMP_THREAD_LIST_Mac.Read( + self.minidump, d.location.rva) assert ctypes.sizeof(thread_list) == d.location.data_size DebugPrint(thread_list) for thread in thread_list.threads: @@ -579,12 +600,19 @@ class MinidumpReader(object): assert self.module_list is None self.module_list = MINIDUMP_MODULE_LIST.Read( self.minidump, d.location.rva) + if ctypes.sizeof(self.module_list) + 4 == d.location.data_size: + self.module_list = MINIDUMP_MODULE_LIST_Mac.Read( + self.minidump, d.location.rva) assert ctypes.sizeof(self.module_list) == d.location.data_size + DebugPrint(self.module_list) elif d.stream_type == MD_MEMORY_LIST_STREAM: print >>sys.stderr, "Warning: This is not a full minidump!" assert self.memory_list is None self.memory_list = MINIDUMP_MEMORY_LIST.Read( self.minidump, d.location.rva) + if ctypes.sizeof(self.memory_list) + 4 == d.location.data_size: + self.memory_list = MINIDUMP_MEMORY_LIST_Mac.Read( + self.minidump, d.location.rva) assert ctypes.sizeof(self.memory_list) == d.location.data_size DebugPrint(self.memory_list) elif d.stream_type == MD_MEMORY_64_LIST_STREAM: