Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: tools/grokdump.py

Issue 1149293005: Add ARM64 suppport to tools/grok_dump.py (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix print Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # 2 #
3 # Copyright 2012 the V8 project authors. All rights reserved. 3 # Copyright 2012 the V8 project authors. All rights reserved.
4 # Redistribution and use in source and binary forms, with or without 4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are 5 # modification, are permitted provided that the following conditions are
6 # met: 6 # met:
7 # 7 #
8 # * Redistributions of source code must retain the above copyright 8 # * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer. 9 # notice, this list of conditions and the following disclaimer.
10 # * Redistributions in binary form must reproduce the above 10 # * Redistributions in binary form must reproduce the above
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 ("r11", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), 339 ("r11", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)),
340 ("r12", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), 340 ("r12", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)),
341 ("sp", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), 341 ("sp", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)),
342 ("lr", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), 342 ("lr", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)),
343 ("pc", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), 343 ("pc", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)),
344 ("cpsr", ctypes.c_uint32), 344 ("cpsr", ctypes.c_uint32),
345 ("float_save", EnableOnFlag(MINIDUMP_FLOATING_SAVE_AREA_ARM.ctype, 345 ("float_save", EnableOnFlag(MINIDUMP_FLOATING_SAVE_AREA_ARM.ctype,
346 MD_CONTEXT_ARM_FLOATING_POINT)) 346 MD_CONTEXT_ARM_FLOATING_POINT))
347 ]) 347 ])
348 348
349
350 MD_CONTEXT_ARM64 = 0x80000000
351 MD_CONTEXT_ARM64_INTEGER = (MD_CONTEXT_ARM64 | 0x00000002)
352 MD_CONTEXT_ARM64_FLOATING_POINT = (MD_CONTEXT_ARM64 | 0x00000004)
353 MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT = 64
354
355 MINIDUMP_FLOATING_SAVE_AREA_ARM = Descriptor([
356 ("fpscr", ctypes.c_uint64),
357 ("regs", ctypes.c_uint64 * MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT),
358 ])
359
360 MINIDUMP_CONTEXT_ARM64 = Descriptor([
361 ("context_flags", ctypes.c_uint64),
362 # MD_CONTEXT_ARM64_INTEGER.
363 ("r0", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
364 ("r1", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
365 ("r2", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
366 ("r3", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
367 ("r4", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
368 ("r5", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
369 ("r6", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
370 ("r7", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
371 ("r8", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
372 ("r9", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
373 ("r10", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
374 ("r11", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
375 ("r12", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
376 ("r13", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
377 ("r14", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
378 ("r15", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
379 ("r16", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
380 ("r17", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
381 ("r18", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
382 ("r19", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
383 ("r20", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
384 ("r21", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
385 ("r22", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
386 ("r23", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
387 ("r24", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
388 ("r25", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
389 ("r26", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
390 ("r27", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
391 ("r28", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
392 ("fp", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
393 ("lr", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
394 ("sp", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
395 ("pc", EnableOnFlag(ctypes.c_uint64, MD_CONTEXT_ARM64_INTEGER)),
396 ("cpsr", ctypes.c_uint32),
397 ("float_save", EnableOnFlag(MINIDUMP_FLOATING_SAVE_AREA_ARM.ctype,
398 MD_CONTEXT_ARM64_FLOATING_POINT))
399 ])
400
401
349 MD_CONTEXT_AMD64 = 0x00100000 402 MD_CONTEXT_AMD64 = 0x00100000
350 MD_CONTEXT_AMD64_CONTROL = (MD_CONTEXT_AMD64 | 0x00000001) 403 MD_CONTEXT_AMD64_CONTROL = (MD_CONTEXT_AMD64 | 0x00000001)
351 MD_CONTEXT_AMD64_INTEGER = (MD_CONTEXT_AMD64 | 0x00000002) 404 MD_CONTEXT_AMD64_INTEGER = (MD_CONTEXT_AMD64 | 0x00000002)
352 MD_CONTEXT_AMD64_SEGMENTS = (MD_CONTEXT_AMD64 | 0x00000004) 405 MD_CONTEXT_AMD64_SEGMENTS = (MD_CONTEXT_AMD64 | 0x00000004)
353 MD_CONTEXT_AMD64_FLOATING_POINT = (MD_CONTEXT_AMD64 | 0x00000008) 406 MD_CONTEXT_AMD64_FLOATING_POINT = (MD_CONTEXT_AMD64 | 0x00000008)
354 MD_CONTEXT_AMD64_DEBUG_REGISTERS = (MD_CONTEXT_AMD64 | 0x00000010) 407 MD_CONTEXT_AMD64_DEBUG_REGISTERS = (MD_CONTEXT_AMD64 | 0x00000010)
355 408
356 MINIDUMP_CONTEXT_AMD64 = Descriptor([ 409 MINIDUMP_CONTEXT_AMD64 = Descriptor([
357 ("p1_home", ctypes.c_uint64), 410 ("p1_home", ctypes.c_uint64),
358 ("p2_home", ctypes.c_uint64), 411 ("p2_home", ctypes.c_uint64),
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 ("junk", ctypes.c_uint32), 560 ("junk", ctypes.c_uint32),
508 ("modules", lambda t: MINIDUMP_RAW_MODULE.ctype * t.number_of_modules) 561 ("modules", lambda t: MINIDUMP_RAW_MODULE.ctype * t.number_of_modules)
509 ]) 562 ])
510 563
511 MINIDUMP_RAW_SYSTEM_INFO = Descriptor([ 564 MINIDUMP_RAW_SYSTEM_INFO = Descriptor([
512 ("processor_architecture", ctypes.c_uint16) 565 ("processor_architecture", ctypes.c_uint16)
513 ]) 566 ])
514 567
515 MD_CPU_ARCHITECTURE_X86 = 0 568 MD_CPU_ARCHITECTURE_X86 = 0
516 MD_CPU_ARCHITECTURE_ARM = 5 569 MD_CPU_ARCHITECTURE_ARM = 5
570 MD_CPU_ARCHITECTURE_ARM64 = 0x8003
517 MD_CPU_ARCHITECTURE_AMD64 = 9 571 MD_CPU_ARCHITECTURE_AMD64 = 9
518 572
519 class FuncSymbol: 573 class FuncSymbol:
520 def __init__(self, start, size, name): 574 def __init__(self, start, size, name):
521 self.start = start 575 self.start = start
522 self.end = self.start + size 576 self.end = self.start + size
523 self.name = name 577 self.name = name
524 578
525 def __cmp__(self, other): 579 def __cmp__(self, other):
526 if isinstance(other, FuncSymbol): 580 if isinstance(other, FuncSymbol):
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 self.symbols = [] 615 self.symbols = []
562 616
563 # Find MDRawSystemInfo stream and determine arch. 617 # Find MDRawSystemInfo stream and determine arch.
564 for d in directories: 618 for d in directories:
565 if d.stream_type == MD_SYSTEM_INFO_STREAM: 619 if d.stream_type == MD_SYSTEM_INFO_STREAM:
566 system_info = MINIDUMP_RAW_SYSTEM_INFO.Read( 620 system_info = MINIDUMP_RAW_SYSTEM_INFO.Read(
567 self.minidump, d.location.rva) 621 self.minidump, d.location.rva)
568 self.arch = system_info.processor_architecture 622 self.arch = system_info.processor_architecture
569 assert self.arch in [MD_CPU_ARCHITECTURE_AMD64, 623 assert self.arch in [MD_CPU_ARCHITECTURE_AMD64,
570 MD_CPU_ARCHITECTURE_ARM, 624 MD_CPU_ARCHITECTURE_ARM,
625 MD_CPU_ARCHITECTURE_ARM64,
571 MD_CPU_ARCHITECTURE_X86] 626 MD_CPU_ARCHITECTURE_X86]
572 assert not self.arch is None 627 assert not self.arch is None
573 628
574 for d in directories: 629 for d in directories:
575 DebugPrint(d) 630 DebugPrint(d)
576 if d.stream_type == MD_EXCEPTION_STREAM: 631 if d.stream_type == MD_EXCEPTION_STREAM:
577 self.exception = MINIDUMP_EXCEPTION_STREAM.Read( 632 self.exception = MINIDUMP_EXCEPTION_STREAM.Read(
578 self.minidump, d.location.rva) 633 self.minidump, d.location.rva)
579 DebugPrint(self.exception) 634 DebugPrint(self.exception)
580 if self.arch == MD_CPU_ARCHITECTURE_X86: 635 if self.arch == MD_CPU_ARCHITECTURE_X86:
581 self.exception_context = MINIDUMP_CONTEXT_X86.Read( 636 self.exception_context = MINIDUMP_CONTEXT_X86.Read(
582 self.minidump, self.exception.thread_context.rva) 637 self.minidump, self.exception.thread_context.rva)
583 elif self.arch == MD_CPU_ARCHITECTURE_AMD64: 638 elif self.arch == MD_CPU_ARCHITECTURE_AMD64:
584 self.exception_context = MINIDUMP_CONTEXT_AMD64.Read( 639 self.exception_context = MINIDUMP_CONTEXT_AMD64.Read(
585 self.minidump, self.exception.thread_context.rva) 640 self.minidump, self.exception.thread_context.rva)
586 elif self.arch == MD_CPU_ARCHITECTURE_ARM: 641 elif self.arch == MD_CPU_ARCHITECTURE_ARM:
587 self.exception_context = MINIDUMP_CONTEXT_ARM.Read( 642 self.exception_context = MINIDUMP_CONTEXT_ARM.Read(
588 self.minidump, self.exception.thread_context.rva) 643 self.minidump, self.exception.thread_context.rva)
644 elif self.arch == MD_CPU_ARCHITECTURE_ARM64:
645 self.exception_context = MINIDUMP_CONTEXT_ARM64.Read(
646 self.minidump, self.exception.thread_context.rva)
589 DebugPrint(self.exception_context) 647 DebugPrint(self.exception_context)
590 elif d.stream_type == MD_THREAD_LIST_STREAM: 648 elif d.stream_type == MD_THREAD_LIST_STREAM:
591 thread_list = MINIDUMP_THREAD_LIST.Read(self.minidump, d.location.rva) 649 thread_list = MINIDUMP_THREAD_LIST.Read(self.minidump, d.location.rva)
592 if ctypes.sizeof(thread_list) + 4 == d.location.data_size: 650 if ctypes.sizeof(thread_list) + 4 == d.location.data_size:
593 thread_list = MINIDUMP_THREAD_LIST_Mac.Read( 651 thread_list = MINIDUMP_THREAD_LIST_Mac.Read(
594 self.minidump, d.location.rva) 652 self.minidump, d.location.rva)
595 assert ctypes.sizeof(thread_list) == d.location.data_size 653 assert ctypes.sizeof(thread_list) == d.location.data_size
596 DebugPrint(thread_list) 654 DebugPrint(thread_list)
597 for thread in thread_list.threads: 655 for thread in thread_list.threads:
598 DebugPrint(thread) 656 DebugPrint(thread)
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 694
637 def ReadU64(self, address): 695 def ReadU64(self, address):
638 location = self.FindLocation(address) 696 location = self.FindLocation(address)
639 return ctypes.c_uint64.from_buffer(self.minidump, location).value 697 return ctypes.c_uint64.from_buffer(self.minidump, location).value
640 698
641 def ReadUIntPtr(self, address): 699 def ReadUIntPtr(self, address):
642 if self.arch == MD_CPU_ARCHITECTURE_AMD64: 700 if self.arch == MD_CPU_ARCHITECTURE_AMD64:
643 return self.ReadU64(address) 701 return self.ReadU64(address)
644 elif self.arch == MD_CPU_ARCHITECTURE_ARM: 702 elif self.arch == MD_CPU_ARCHITECTURE_ARM:
645 return self.ReadU32(address) 703 return self.ReadU32(address)
704 elif self.arch == MD_CPU_ARCHITECTURE_ARM64:
705 return self.ReadU64(address)
646 elif self.arch == MD_CPU_ARCHITECTURE_X86: 706 elif self.arch == MD_CPU_ARCHITECTURE_X86:
647 return self.ReadU32(address) 707 return self.ReadU32(address)
648 708
649 def ReadBytes(self, address, size): 709 def ReadBytes(self, address, size):
650 location = self.FindLocation(address) 710 location = self.FindLocation(address)
651 return self.minidump[location:location + size] 711 return self.minidump[location:location + size]
652 712
653 def _ReadWord(self, location): 713 def _ReadWord(self, location):
654 if self.arch == MD_CPU_ARCHITECTURE_AMD64: 714 if self.arch == MD_CPU_ARCHITECTURE_AMD64:
655 return ctypes.c_uint64.from_buffer(self.minidump, location).value 715 return ctypes.c_uint64.from_buffer(self.minidump, location).value
656 elif self.arch == MD_CPU_ARCHITECTURE_ARM: 716 elif self.arch == MD_CPU_ARCHITECTURE_ARM:
657 return ctypes.c_uint32.from_buffer(self.minidump, location).value 717 return ctypes.c_uint32.from_buffer(self.minidump, location).value
718 elif self.arch == MD_CPU_ARCHITECTURE_ARM64:
719 return ctypes.c_uint64.from_buffer(self.minidump, location).value
658 elif self.arch == MD_CPU_ARCHITECTURE_X86: 720 elif self.arch == MD_CPU_ARCHITECTURE_X86:
659 return ctypes.c_uint32.from_buffer(self.minidump, location).value 721 return ctypes.c_uint32.from_buffer(self.minidump, location).value
660 722
661 def IsProbableASCIIRegion(self, location, length): 723 def IsProbableASCIIRegion(self, location, length):
662 ascii_bytes = 0 724 ascii_bytes = 0
663 non_ascii_bytes = 0 725 non_ascii_bytes = 0
664 for i in xrange(length): 726 for i in xrange(length):
665 loc = location + i 727 loc = location + i
666 byte = ctypes.c_uint8.from_buffer(self.minidump, loc).value 728 byte = ctypes.c_uint8.from_buffer(self.minidump, loc).value
667 if byte >= 0x7f: 729 if byte >= 0x7f:
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 837
776 location = self.FindLocation(address) 838 location = self.FindLocation(address)
777 if location is None: return [] 839 if location is None: return []
778 arch = None 840 arch = None
779 possible_objdump_flags = [""] 841 possible_objdump_flags = [""]
780 if self.arch == MD_CPU_ARCHITECTURE_X86: 842 if self.arch == MD_CPU_ARCHITECTURE_X86:
781 arch = "ia32" 843 arch = "ia32"
782 elif self.arch == MD_CPU_ARCHITECTURE_ARM: 844 elif self.arch == MD_CPU_ARCHITECTURE_ARM:
783 arch = "arm" 845 arch = "arm"
784 possible_objdump_flags = ["", "--disassembler-options=force-thumb"] 846 possible_objdump_flags = ["", "--disassembler-options=force-thumb"]
847 elif self.arch == MD_CPU_ARCHITECTURE_ARM64:
848 arch = "arm64"
849 possible_objdump_flags = ["", "--disassembler-options=force-thumb"]
785 elif self.arch == MD_CPU_ARCHITECTURE_AMD64: 850 elif self.arch == MD_CPU_ARCHITECTURE_AMD64:
786 arch = "x64" 851 arch = "x64"
787 results = [ disasm.GetDisasmLines(self.minidump_name, 852 results = [ disasm.GetDisasmLines(self.minidump_name,
788 location, 853 location,
789 size, 854 size,
790 arch, 855 arch,
791 False, 856 False,
792 objdump_flags) 857 objdump_flags)
793 for objdump_flags in possible_objdump_flags ] 858 for objdump_flags in possible_objdump_flags ]
794 return min(results, key=CountUndefinedInstructions) 859 return min(results, key=CountUndefinedInstructions)
795 860
796 861
797 def Dispose(self): 862 def Dispose(self):
798 self.minidump.close() 863 self.minidump.close()
799 self.minidump_file.close() 864 self.minidump_file.close()
800 865
801 def ExceptionIP(self): 866 def ExceptionIP(self):
802 if self.arch == MD_CPU_ARCHITECTURE_AMD64: 867 if self.arch == MD_CPU_ARCHITECTURE_AMD64:
803 return self.exception_context.rip 868 return self.exception_context.rip
804 elif self.arch == MD_CPU_ARCHITECTURE_ARM: 869 elif self.arch == MD_CPU_ARCHITECTURE_ARM:
805 return self.exception_context.pc 870 return self.exception_context.pc
871 elif self.arch == MD_CPU_ARCHITECTURE_ARM64:
872 return self.exception_context.pc
806 elif self.arch == MD_CPU_ARCHITECTURE_X86: 873 elif self.arch == MD_CPU_ARCHITECTURE_X86:
807 return self.exception_context.eip 874 return self.exception_context.eip
808 875
809 def ExceptionSP(self): 876 def ExceptionSP(self):
810 if self.arch == MD_CPU_ARCHITECTURE_AMD64: 877 if self.arch == MD_CPU_ARCHITECTURE_AMD64:
811 return self.exception_context.rsp 878 return self.exception_context.rsp
812 elif self.arch == MD_CPU_ARCHITECTURE_ARM: 879 elif self.arch == MD_CPU_ARCHITECTURE_ARM:
813 return self.exception_context.sp 880 return self.exception_context.sp
881 elif self.arch == MD_CPU_ARCHITECTURE_ARM64:
882 return self.exception_context.sp
814 elif self.arch == MD_CPU_ARCHITECTURE_X86: 883 elif self.arch == MD_CPU_ARCHITECTURE_X86:
815 return self.exception_context.esp 884 return self.exception_context.esp
816 885
817 def ExceptionFP(self): 886 def ExceptionFP(self):
818 if self.arch == MD_CPU_ARCHITECTURE_AMD64: 887 if self.arch == MD_CPU_ARCHITECTURE_AMD64:
819 return self.exception_context.rbp 888 return self.exception_context.rbp
820 elif self.arch == MD_CPU_ARCHITECTURE_ARM: 889 elif self.arch == MD_CPU_ARCHITECTURE_ARM:
821 return None 890 return None
891 elif self.arch == MD_CPU_ARCHITECTURE_ARM64:
892 return self.exception_context.fp
822 elif self.arch == MD_CPU_ARCHITECTURE_X86: 893 elif self.arch == MD_CPU_ARCHITECTURE_X86:
823 return self.exception_context.ebp 894 return self.exception_context.ebp
824 895
825 def FormatIntPtr(self, value): 896 def FormatIntPtr(self, value):
826 if self.arch == MD_CPU_ARCHITECTURE_AMD64: 897 if self.arch == MD_CPU_ARCHITECTURE_AMD64:
827 return "%016x" % value 898 return "%016x" % value
828 elif self.arch == MD_CPU_ARCHITECTURE_ARM: 899 elif self.arch == MD_CPU_ARCHITECTURE_ARM:
829 return "%08x" % value 900 return "%08x" % value
901 elif self.arch == MD_CPU_ARCHITECTURE_ARM64:
902 return "%016x" % value
830 elif self.arch == MD_CPU_ARCHITECTURE_X86: 903 elif self.arch == MD_CPU_ARCHITECTURE_X86:
831 return "%08x" % value 904 return "%08x" % value
832 905
833 def PointerSize(self): 906 def PointerSize(self):
834 if self.arch == MD_CPU_ARCHITECTURE_AMD64: 907 if self.arch == MD_CPU_ARCHITECTURE_AMD64:
835 return 8 908 return 8
836 elif self.arch == MD_CPU_ARCHITECTURE_ARM: 909 elif self.arch == MD_CPU_ARCHITECTURE_ARM:
837 return 4 910 return 4
911 elif self.arch == MD_CPU_ARCHITECTURE_ARM64:
912 return 8
838 elif self.arch == MD_CPU_ARCHITECTURE_X86: 913 elif self.arch == MD_CPU_ARCHITECTURE_X86:
839 return 4 914 return 4
840 915
841 def Register(self, name): 916 def Register(self, name):
842 return self.exception_context.__getattribute__(name) 917 return self.exception_context.__getattribute__(name)
843 918
844 def ReadMinidumpString(self, rva): 919 def ReadMinidumpString(self, rva):
845 string = bytearray(MINIDUMP_STRING.Read(self.minidump, rva).buffer) 920 string = bytearray(MINIDUMP_STRING.Read(self.minidump, rva).buffer)
846 string = string.decode("utf16") 921 string = string.decode("utf16")
847 return string[0:len(string) - 1] 922 return string[0:len(string) - 1]
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
1591 return self.reader.PointerSize() 1666 return self.reader.PointerSize()
1592 1667
1593 def ObjectAlignmentMask(self): 1668 def ObjectAlignmentMask(self):
1594 return self.PointerSize() - 1 1669 return self.PointerSize() - 1
1595 1670
1596 def MapAlignmentMask(self): 1671 def MapAlignmentMask(self):
1597 if self.reader.arch == MD_CPU_ARCHITECTURE_AMD64: 1672 if self.reader.arch == MD_CPU_ARCHITECTURE_AMD64:
1598 return (1 << 4) - 1 1673 return (1 << 4) - 1
1599 elif self.reader.arch == MD_CPU_ARCHITECTURE_ARM: 1674 elif self.reader.arch == MD_CPU_ARCHITECTURE_ARM:
1600 return (1 << 4) - 1 1675 return (1 << 4) - 1
1676 elif self.reader.arch == MD_CPU_ARCHITECTURE_ARM64:
1677 return (1 << 4) - 1
1601 elif self.reader.arch == MD_CPU_ARCHITECTURE_X86: 1678 elif self.reader.arch == MD_CPU_ARCHITECTURE_X86:
1602 return (1 << 5) - 1 1679 return (1 << 5) - 1
1603 1680
1604 def PageAlignmentMask(self): 1681 def PageAlignmentMask(self):
1605 return (1 << 20) - 1 1682 return (1 << 20) - 1
1606 1683
1607 1684
1608 class KnownObject(HeapObject): 1685 class KnownObject(HeapObject):
1609 def __init__(self, heap, known_name): 1686 def __init__(self, heap, known_name):
1610 HeapObject.__init__(self, heap, None, None) 1687 HeapObject.__init__(self, heap, None, None)
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after
2268 if self.reader.exception.exception.parameter_count > 0: 2345 if self.reader.exception.exception.parameter_count > 0:
2269 f.write("&nbsp;&nbsp; Exception parameters: \n") 2346 f.write("&nbsp;&nbsp; Exception parameters: \n")
2270 for i in xrange(0, self.reader.exception.exception.parameter_count): 2347 for i in xrange(0, self.reader.exception.exception.parameter_count):
2271 f.write("%08x" % self.reader.exception.exception.information[i]) 2348 f.write("%08x" % self.reader.exception.exception.information[i])
2272 f.write("<br><br>\n") 2349 f.write("<br><br>\n")
2273 2350
2274 for r in CONTEXT_FOR_ARCH[self.reader.arch]: 2351 for r in CONTEXT_FOR_ARCH[self.reader.arch]:
2275 f.write(HTML_REG_FORMAT % 2352 f.write(HTML_REG_FORMAT %
2276 (r, self.format_address(self.reader.Register(r)))) 2353 (r, self.format_address(self.reader.Register(r))))
2277 # TODO(vitalyr): decode eflags. 2354 # TODO(vitalyr): decode eflags.
2278 if self.reader.arch == MD_CPU_ARCHITECTURE_ARM: 2355 if self.reader.arch in [MD_CPU_ARCHITECTURE_ARM, MD_CPU_ARCHITECTURE_ARM64]:
2279 f.write("<b>cpsr</b>: %s" % bin(self.reader.exception_context.cpsr)[2:]) 2356 f.write("<b>cpsr</b>: %s" % bin(self.reader.exception_context.cpsr)[2:])
2280 else: 2357 else:
2281 f.write("<b>eflags</b>: %s" % 2358 f.write("<b>eflags</b>: %s" %
2282 bin(self.reader.exception_context.eflags)[2:]) 2359 bin(self.reader.exception_context.eflags)[2:])
2283 f.write('</div>\n') 2360 f.write('</div>\n')
2284 return 2361 return
2285 2362
2286 def align_down(self, a, size): 2363 def align_down(self, a, size):
2287 alignment_correction = a % size 2364 alignment_correction = a % size
2288 return a - alignment_correction 2365 return a - alignment_correction
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after
3010 3087
3011 EIP_PROXIMITY = 64 3088 EIP_PROXIMITY = 64
3012 3089
3013 CONTEXT_FOR_ARCH = { 3090 CONTEXT_FOR_ARCH = {
3014 MD_CPU_ARCHITECTURE_AMD64: 3091 MD_CPU_ARCHITECTURE_AMD64:
3015 ['rax', 'rbx', 'rcx', 'rdx', 'rdi', 'rsi', 'rbp', 'rsp', 'rip', 3092 ['rax', 'rbx', 'rcx', 'rdx', 'rdi', 'rsi', 'rbp', 'rsp', 'rip',
3016 'r8', 'r9', 'r10', 'r11', 'r12', 'r13', 'r14', 'r15'], 3093 'r8', 'r9', 'r10', 'r11', 'r12', 'r13', 'r14', 'r15'],
3017 MD_CPU_ARCHITECTURE_ARM: 3094 MD_CPU_ARCHITECTURE_ARM:
3018 ['r0', 'r1', 'r2', 'r3', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9', 3095 ['r0', 'r1', 'r2', 'r3', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9',
3019 'r10', 'r11', 'r12', 'sp', 'lr', 'pc'], 3096 'r10', 'r11', 'r12', 'sp', 'lr', 'pc'],
3097 MD_CPU_ARCHITECTURE_ARM64:
3098 ['r0', 'r1', 'r2', 'r3', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9',
3099 'r10', 'r11', 'r12', 'r13', 'r14', 'r15', 'r16', 'r17', 'r18', 'r19',
3100 'r20', 'r21', 'r22', 'r23', 'r24', 'r25', 'r26', 'r27', 'r28',
3101 'fp', 'lr', 'sp', 'pc'],
3020 MD_CPU_ARCHITECTURE_X86: 3102 MD_CPU_ARCHITECTURE_X86:
3021 ['eax', 'ebx', 'ecx', 'edx', 'edi', 'esi', 'ebp', 'esp', 'eip'] 3103 ['eax', 'ebx', 'ecx', 'edx', 'edi', 'esi', 'ebp', 'esp', 'eip']
3022 } 3104 }
3023 3105
3024 KNOWN_MODULES = {'chrome.exe', 'chrome.dll'} 3106 KNOWN_MODULES = {'chrome.exe', 'chrome.dll'}
3025 3107
3026 def GetVersionString(ms, ls): 3108 def GetVersionString(ms, ls):
3027 return "%d.%d.%d.%d" % (ms >> 16, ms & 0xffff, ls >> 16, ls & 0xffff) 3109 return "%d.%d.%d.%d" % (ms >> 16, ms & 0xffff, ls >> 16, ls & 0xffff)
3028 3110
3029 3111
(...skipping 27 matching lines...) Expand all
3057 print "Minidump has no exception info" 3139 print "Minidump has no exception info"
3058 else: 3140 else:
3059 print "Exception info:" 3141 print "Exception info:"
3060 exception_thread = reader.thread_map[reader.exception.thread_id] 3142 exception_thread = reader.thread_map[reader.exception.thread_id]
3061 print " thread id: %d" % exception_thread.id 3143 print " thread id: %d" % exception_thread.id
3062 print " code: %08X" % reader.exception.exception.code 3144 print " code: %08X" % reader.exception.exception.code
3063 print " context:" 3145 print " context:"
3064 for r in CONTEXT_FOR_ARCH[reader.arch]: 3146 for r in CONTEXT_FOR_ARCH[reader.arch]:
3065 print " %s: %s" % (r, reader.FormatIntPtr(reader.Register(r))) 3147 print " %s: %s" % (r, reader.FormatIntPtr(reader.Register(r)))
3066 # TODO(vitalyr): decode eflags. 3148 # TODO(vitalyr): decode eflags.
3067 if reader.arch == MD_CPU_ARCHITECTURE_ARM: 3149 if reader.arch in [MD_CPU_ARCHITECTURE_ARM, MD_CPU_ARCHITECTURE_ARM64]:
3068 print " cpsr: %s" % bin(reader.exception_context.cpsr)[2:] 3150 print " cpsr: %s" % bin(reader.exception_context.cpsr)[2:]
3069 else: 3151 else:
3070 print " eflags: %s" % bin(reader.exception_context.eflags)[2:] 3152 print " eflags: %s" % bin(reader.exception_context.eflags)[2:]
3071 3153
3072 print 3154 print
3073 print " modules:" 3155 print " modules:"
3074 for module in reader.module_list.modules: 3156 for module in reader.module_list.modules:
3075 name = GetModuleName(reader, module) 3157 name = GetModuleName(reader, module)
3076 if name in KNOWN_MODULES: 3158 if name in KNOWN_MODULES:
3077 print " %s at %08X" % (name, module.base_of_image) 3159 print " %s at %08X" % (name, module.base_of_image)
(...skipping 17 matching lines...) Expand all
3095 disasm_start = reader.ExceptionIP() - EIP_PROXIMITY 3177 disasm_start = reader.ExceptionIP() - EIP_PROXIMITY
3096 disasm_bytes = 2 * EIP_PROXIMITY 3178 disasm_bytes = 2 * EIP_PROXIMITY
3097 if (options.full): 3179 if (options.full):
3098 full_range = reader.FindRegion(reader.ExceptionIP()) 3180 full_range = reader.FindRegion(reader.ExceptionIP())
3099 if full_range is not None: 3181 if full_range is not None:
3100 disasm_start = full_range[0] 3182 disasm_start = full_range[0]
3101 disasm_bytes = full_range[1] 3183 disasm_bytes = full_range[1]
3102 3184
3103 lines = reader.GetDisasmLines(disasm_start, disasm_bytes) 3185 lines = reader.GetDisasmLines(disasm_start, disasm_bytes)
3104 3186
3187 if not lines:
3188 print "Could not disassemble using %s." % OBJDUMP_BIN
3189 print "Pass path to architecture specific objdump via --objdump?"
3190
3105 for line in lines: 3191 for line in lines:
3106 print FormatDisasmLine(disasm_start, heap, line) 3192 print FormatDisasmLine(disasm_start, heap, line)
3107 print 3193 print
3108 3194
3109 if heap is None: 3195 if heap is None:
3110 heap = V8Heap(reader, None) 3196 heap = V8Heap(reader, None)
3111 3197
3112 if options.full: 3198 if options.full:
3113 FullDump(reader, heap) 3199 FullDump(reader, heap)
3114 3200
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
3190 try: 3276 try:
3191 server = InspectionWebServer(PORT_NUMBER, options, args[0]) 3277 server = InspectionWebServer(PORT_NUMBER, options, args[0])
3192 print 'Started httpserver on port ' , PORT_NUMBER 3278 print 'Started httpserver on port ' , PORT_NUMBER
3193 webbrowser.open('http://localhost:%i/summary.html' % PORT_NUMBER) 3279 webbrowser.open('http://localhost:%i/summary.html' % PORT_NUMBER)
3194 server.serve_forever() 3280 server.serve_forever()
3195 except KeyboardInterrupt: 3281 except KeyboardInterrupt:
3196 print '^C received, shutting down the web server' 3282 print '^C received, shutting down the web server'
3197 server.socket.close() 3283 server.socket.close()
3198 else: 3284 else:
3199 AnalyzeMinidump(options, args[0]) 3285 AnalyzeMinidump(options, args[0])
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698