| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 2268 if self.reader.exception.exception.parameter_count > 0: | 2345 if self.reader.exception.exception.parameter_count > 0: |
| 2269 f.write(" Exception parameters: \n") | 2346 f.write(" 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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]) |
| OLD | NEW |