diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2015-08-14 11:38:45 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2015-08-14 17:16:47 +0000 |
commit | 3a97ca8dd9b96b599ae2d33e40df0dd2f7ea5859 (patch) | |
tree | 43cc572ba067417c7341db81f71ae7cc6e0fcc3e /chromium/v8/tools/grokdump.py | |
parent | f61ab1ac7f855cd281809255c0aedbb1895e1823 (diff) | |
download | qtwebengine-chromium-3a97ca8dd9b96b599ae2d33e40df0dd2f7ea5859.tar.gz |
BASELINE: Update chromium to 45.0.2454.40
Change-Id: Id2121d9f11a8fc633677236c65a3e41feef589e4
Reviewed-by: Andras Becsi <andras.becsi@theqtcompany.com>
Diffstat (limited to 'chromium/v8/tools/grokdump.py')
-rwxr-xr-x | chromium/v8/tools/grokdump.py | 154 |
1 files changed, 133 insertions, 21 deletions
diff --git a/chromium/v8/tools/grokdump.py b/chromium/v8/tools/grokdump.py index 26e53c78541..ab8f3265a6e 100755 --- a/chromium/v8/tools/grokdump.py +++ b/chromium/v8/tools/grokdump.py @@ -135,10 +135,11 @@ def FullDump(reader, heap): if is_ascii is not False: # Output in the same format as the Unix hd command addr = start - for slot in xrange(location, location + size, 16): + for i in xrange(0, size, 16): + slot = i + location hex_line = "" asc_line = "" - for i in xrange(0, 16): + for i in xrange(16): if slot + i < location + size: byte = ctypes.c_uint8.from_buffer(reader.minidump, slot + i).value if byte >= 0x20 and byte < 0x7f: @@ -158,9 +159,9 @@ def FullDump(reader, heap): if is_executable is not True and is_ascii is not True: print "%s - %s" % (reader.FormatIntPtr(start), reader.FormatIntPtr(start + size)) - for slot in xrange(start, - start + size, - reader.PointerSize()): + print start + size + 1; + for i in xrange(0, size, reader.PointerSize()): + slot = start + i maybe_address = reader.ReadUIntPtr(slot) heap_object = heap.FindObject(maybe_address) print "%s: %s" % (reader.FormatIntPtr(slot), @@ -345,6 +346,59 @@ MINIDUMP_CONTEXT_ARM = Descriptor([ MD_CONTEXT_ARM_FLOATING_POINT)) ]) + +MD_CONTEXT_ARM64 = 0x80000000 +MD_CONTEXT_ARM64_INTEGER = (MD_CONTEXT_ARM64 | 0x00000002) +MD_CONTEXT_ARM64_FLOATING_POINT = (MD_CONTEXT_ARM64 | 0x00000004) +MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT = 64 + +MINIDUMP_FLOATING_SAVE_AREA_ARM = Descriptor([ + ("fpscr", ctypes.c_uint64), + ("regs", ctypes.c_uint64 * MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT), +]) + +MINIDUMP_CONTEXT_ARM64 = Descriptor([ + ("context_flags", ctypes.c_uint64), + # MD_CONTEXT_ARM64_INTEGER. + ("r0", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r1", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r2", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r3", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r4", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r5", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r6", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r7", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r8", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r9", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r10", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r11", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r12", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r13", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r14", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r15", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r16", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r17", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r18", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r19", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r20", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r21", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r22", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r23", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r24", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r25", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r26", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r27", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("r28", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("fp", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("lr", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("sp", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("pc", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)), + ("cpsr", ctypes.c_uint32), + ("float_save", EnableOnFlag(MINIDUMP_FLOATING_SAVE_AREA_ARM.ctype, + MD_CONTEXT_ARM64_FLOATING_POINT)) +]) + + MD_CONTEXT_AMD64 = 0x00100000 MD_CONTEXT_AMD64_CONTROL = (MD_CONTEXT_AMD64 | 0x00000001) MD_CONTEXT_AMD64_INTEGER = (MD_CONTEXT_AMD64 | 0x00000002) @@ -513,6 +567,7 @@ MINIDUMP_RAW_SYSTEM_INFO = Descriptor([ MD_CPU_ARCHITECTURE_X86 = 0 MD_CPU_ARCHITECTURE_ARM = 5 +MD_CPU_ARCHITECTURE_ARM64 = 0x8003 MD_CPU_ARCHITECTURE_AMD64 = 9 class FuncSymbol: @@ -567,6 +622,7 @@ class MinidumpReader(object): self.arch = system_info.processor_architecture assert self.arch in [MD_CPU_ARCHITECTURE_AMD64, MD_CPU_ARCHITECTURE_ARM, + MD_CPU_ARCHITECTURE_ARM64, MD_CPU_ARCHITECTURE_X86] assert not self.arch is None @@ -585,6 +641,9 @@ class MinidumpReader(object): elif self.arch == MD_CPU_ARCHITECTURE_ARM: self.exception_context = MINIDUMP_CONTEXT_ARM.Read( self.minidump, self.exception.thread_context.rva) + elif self.arch == MD_CPU_ARCHITECTURE_ARM64: + self.exception_context = MINIDUMP_CONTEXT_ARM64.Read( + self.minidump, self.exception.thread_context.rva) DebugPrint(self.exception_context) elif d.stream_type == MD_THREAD_LIST_STREAM: thread_list = MINIDUMP_THREAD_LIST.Read(self.minidump, d.location.rva) @@ -642,6 +701,8 @@ class MinidumpReader(object): return self.ReadU64(address) elif self.arch == MD_CPU_ARCHITECTURE_ARM: return self.ReadU32(address) + elif self.arch == MD_CPU_ARCHITECTURE_ARM64: + return self.ReadU64(address) elif self.arch == MD_CPU_ARCHITECTURE_X86: return self.ReadU32(address) @@ -654,13 +715,16 @@ class MinidumpReader(object): return ctypes.c_uint64.from_buffer(self.minidump, location).value elif self.arch == MD_CPU_ARCHITECTURE_ARM: return ctypes.c_uint32.from_buffer(self.minidump, location).value + elif self.arch == MD_CPU_ARCHITECTURE_ARM64: + return ctypes.c_uint64.from_buffer(self.minidump, location).value elif self.arch == MD_CPU_ARCHITECTURE_X86: return ctypes.c_uint32.from_buffer(self.minidump, location).value def IsProbableASCIIRegion(self, location, length): ascii_bytes = 0 non_ascii_bytes = 0 - for loc in xrange(location, location + length): + for i in xrange(length): + loc = location + i byte = ctypes.c_uint8.from_buffer(self.minidump, loc).value if byte >= 0x7f: non_ascii_bytes += 1 @@ -681,7 +745,8 @@ class MinidumpReader(object): def IsProbableExecutableRegion(self, location, length): opcode_bytes = 0 sixty_four = self.arch == MD_CPU_ARCHITECTURE_AMD64 - for loc in xrange(location, location + length): + for i in xrange(length): + loc = location + i byte = ctypes.c_uint8.from_buffer(self.minidump, loc).value if (byte == 0x8b or # mov byte == 0x89 or # mov reg-reg @@ -729,7 +794,8 @@ class MinidumpReader(object): def FindWord(self, word, alignment=0): def search_inside_region(reader, start, size, location): location = (location + alignment) & ~alignment - for loc in xrange(location, location + size - self.PointerSize()): + for i in xrange(size - self.PointerSize()): + loc = location + i if reader._ReadWord(loc) == word: slot = start + (loc - location) print "%s: %s" % (reader.FormatIntPtr(slot), @@ -740,7 +806,8 @@ class MinidumpReader(object): aligned_res = [] unaligned_res = [] def search_inside_region(reader, start, size, location): - for loc in xrange(location, location + size - self.PointerSize()): + for i in xrange(size - self.PointerSize()): + loc = location + i if reader._ReadWord(loc) == word: slot = start + (loc - location) if slot % self.PointerSize() == 0: @@ -777,6 +844,9 @@ class MinidumpReader(object): elif self.arch == MD_CPU_ARCHITECTURE_ARM: arch = "arm" possible_objdump_flags = ["", "--disassembler-options=force-thumb"] + elif self.arch == MD_CPU_ARCHITECTURE_ARM64: + arch = "arm64" + possible_objdump_flags = ["", "--disassembler-options=force-thumb"] elif self.arch == MD_CPU_ARCHITECTURE_AMD64: arch = "x64" results = [ disasm.GetDisasmLines(self.minidump_name, @@ -798,6 +868,8 @@ class MinidumpReader(object): return self.exception_context.rip elif self.arch == MD_CPU_ARCHITECTURE_ARM: return self.exception_context.pc + elif self.arch == MD_CPU_ARCHITECTURE_ARM64: + return self.exception_context.pc elif self.arch == MD_CPU_ARCHITECTURE_X86: return self.exception_context.eip @@ -806,6 +878,8 @@ class MinidumpReader(object): return self.exception_context.rsp elif self.arch == MD_CPU_ARCHITECTURE_ARM: return self.exception_context.sp + elif self.arch == MD_CPU_ARCHITECTURE_ARM64: + return self.exception_context.sp elif self.arch == MD_CPU_ARCHITECTURE_X86: return self.exception_context.esp @@ -814,6 +888,8 @@ class MinidumpReader(object): return self.exception_context.rbp elif self.arch == MD_CPU_ARCHITECTURE_ARM: return None + elif self.arch == MD_CPU_ARCHITECTURE_ARM64: + return self.exception_context.fp elif self.arch == MD_CPU_ARCHITECTURE_X86: return self.exception_context.ebp @@ -822,6 +898,8 @@ class MinidumpReader(object): return "%016x" % value elif self.arch == MD_CPU_ARCHITECTURE_ARM: return "%08x" % value + elif self.arch == MD_CPU_ARCHITECTURE_ARM64: + return "%016x" % value elif self.arch == MD_CPU_ARCHITECTURE_X86: return "%08x" % value @@ -830,6 +908,8 @@ class MinidumpReader(object): return 8 elif self.arch == MD_CPU_ARCHITECTURE_ARM: return 4 + elif self.arch == MD_CPU_ARCHITECTURE_ARM64: + return 8 elif self.arch == MD_CPU_ARCHITECTURE_X86: return 4 @@ -1593,6 +1673,8 @@ class V8Heap(object): return (1 << 4) - 1 elif self.reader.arch == MD_CPU_ARCHITECTURE_ARM: return (1 << 4) - 1 + elif self.reader.arch == MD_CPU_ARCHITECTURE_ARM64: + return (1 << 4) - 1 elif self.reader.arch == MD_CPU_ARCHITECTURE_X86: return (1 << 5) - 1 @@ -2270,7 +2352,7 @@ class InspectionWebFormatter(object): f.write(HTML_REG_FORMAT % (r, self.format_address(self.reader.Register(r)))) # TODO(vitalyr): decode eflags. - if self.reader.arch == MD_CPU_ARCHITECTURE_ARM: + if self.reader.arch in [MD_CPU_ARCHITECTURE_ARM, MD_CPU_ARCHITECTURE_ARM64]: f.write("<b>cpsr</b>: %s" % bin(self.reader.exception_context.cpsr)[2:]) else: f.write("<b>eflags</b>: %s" % @@ -2338,7 +2420,8 @@ class InspectionWebFormatter(object): f.write('<div class="code">') f.write("<table class=\"codedump\">\n") - for slot in xrange(start_address, end_address, size): + for j in xrange(0, end_address - start_address, size): + slot = start_address + j heap_object = "" maybe_address = None end_region = region[0] + region[1] @@ -2413,7 +2496,8 @@ class InspectionWebFormatter(object): start = self.align_down(start_address, line_width) - for address in xrange(start, end_address): + for i in xrange(end_address - start): + address = start + i if address % 64 == 0: if address != start: f.write("<br>") @@ -2482,7 +2566,7 @@ class InspectionWebFormatter(object): (start_address, end_address, highlight_address, expand)) f.write('<div class="code">') f.write("<table class=\"codedump\">\n"); - for i in xrange(0, len(lines)): + for i in xrange(len(lines)): line = lines[i] next_address = count if i + 1 < len(lines): @@ -2838,9 +2922,10 @@ class InspectionShell(cmd.Cmd): num = int(args[1], 16) if len(args) > 1 else 0x10 if (start & self.heap.ObjectAlignmentMask()) != 0: print "Warning: Dumping un-aligned memory, is this what you had in mind?" - for slot in xrange(start, - start + self.reader.PointerSize() * num, - self.reader.PointerSize()): + for i in xrange(0, + self.reader.PointerSize() * num, + self.reader.PointerSize()): + slot = start + i if not self.reader.IsValidAddress(slot): print "Address is not contained within the minidump!" return @@ -3009,6 +3094,11 @@ CONTEXT_FOR_ARCH = { MD_CPU_ARCHITECTURE_ARM: ['r0', 'r1', 'r2', 'r3', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9', 'r10', 'r11', 'r12', 'sp', 'lr', 'pc'], + MD_CPU_ARCHITECTURE_ARM64: + ['r0', 'r1', 'r2', 'r3', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9', + 'r10', 'r11', 'r12', 'r13', 'r14', 'r15', 'r16', 'r17', 'r18', 'r19', + 'r20', 'r21', 'r22', 'r23', 'r24', 'r25', 'r26', 'r27', 'r28', + 'fp', 'lr', 'sp', 'pc'], MD_CPU_ARCHITECTURE_X86: ['eax', 'ebx', 'ecx', 'edx', 'edi', 'esi', 'ebp', 'esp', 'eip'] } @@ -3056,7 +3146,7 @@ def AnalyzeMinidump(options, minidump_name): for r in CONTEXT_FOR_ARCH[reader.arch]: print " %s: %s" % (r, reader.FormatIntPtr(reader.Register(r))) # TODO(vitalyr): decode eflags. - if reader.arch == MD_CPU_ARCHITECTURE_ARM: + if reader.arch in [MD_CPU_ARCHITECTURE_ARM, MD_CPU_ARCHITECTURE_ARM64]: print " cpsr: %s" % bin(reader.exception_context.cpsr)[2:] else: print " eflags: %s" % bin(reader.exception_context.eflags)[2:] @@ -3094,6 +3184,10 @@ def AnalyzeMinidump(options, minidump_name): lines = reader.GetDisasmLines(disasm_start, disasm_bytes) + if not lines: + print "Could not disassemble using %s." % OBJDUMP_BIN + print "Pass path to architecture specific objdump via --objdump?" + for line in lines: print FormatDisasmLine(disasm_start, heap, line) print @@ -3115,20 +3209,38 @@ def AnalyzeMinidump(options, minidump_name): elif not options.command: if reader.exception is not None: frame_pointer = reader.ExceptionFP() + in_oom_dump_area = False print "Annotated stack (from exception.esp to bottom):" for slot in xrange(stack_top, stack_bottom, reader.PointerSize()): ascii_content = [c if c >= '\x20' and c < '\x7f' else '.' for c in reader.ReadBytes(slot, reader.PointerSize())] maybe_address = reader.ReadUIntPtr(slot) + maybe_address_contents = None + if maybe_address >= stack_top and maybe_address <= stack_bottom: + maybe_address_contents = reader.ReadUIntPtr(maybe_address) + if maybe_address_contents == 0xdecade00: + in_oom_dump_area = True heap_object = heap.FindObject(maybe_address) maybe_symbol = reader.FindSymbol(maybe_address) + oom_comment = "" + if in_oom_dump_area: + if maybe_address_contents == 0xdecade00: + oom_comment = " <----- HeapStats start marker" + elif maybe_address_contents == 0xdecade01: + oom_comment = " <----- HeapStats end marker" + elif maybe_address_contents is not None: + oom_comment = " %d (%d Mbytes)" % (maybe_address_contents, + maybe_address_contents >> 20) if slot == frame_pointer: maybe_symbol = "<---- frame pointer" frame_pointer = maybe_address - print "%s: %s %s %s" % (reader.FormatIntPtr(slot), - reader.FormatIntPtr(maybe_address), - "".join(ascii_content), - maybe_symbol or "") + print "%s: %s %s %s%s" % (reader.FormatIntPtr(slot), + reader.FormatIntPtr(maybe_address), + "".join(ascii_content), + maybe_symbol or "", + oom_comment) + if maybe_address_contents == 0xdecade01: + in_oom_dump_area = False if heap_object: heap_object.Print(Printer()) print |