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 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
317 MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT = 8 | 317 MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT = 8 |
318 | 318 |
319 MINIDUMP_FLOATING_SAVE_AREA_ARM = Descriptor([ | 319 MINIDUMP_FLOATING_SAVE_AREA_ARM = Descriptor([ |
320 ("fpscr", ctypes.c_uint64), | 320 ("fpscr", ctypes.c_uint64), |
321 ("regs", ctypes.c_uint64 * MD_FLOATINGSAVEAREA_ARM_FPR_COUNT), | 321 ("regs", ctypes.c_uint64 * MD_FLOATINGSAVEAREA_ARM_FPR_COUNT), |
322 ("extra", ctypes.c_uint64 * MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT) | 322 ("extra", ctypes.c_uint64 * MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT) |
323 ]) | 323 ]) |
324 | 324 |
325 MINIDUMP_CONTEXT_ARM = Descriptor([ | 325 MINIDUMP_CONTEXT_ARM = Descriptor([ |
326 ("context_flags", ctypes.c_uint32), | 326 ("context_flags", ctypes.c_uint32), |
327 # MD_CONTEXT_ARM_INTEGER. | 327 # MD_CONTEXT_ARM64_INTEGER. |
328 ("r0", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 328 ("r0", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
329 ("r1", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 329 ("r1", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
330 ("r2", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 330 ("r2", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
331 ("r3", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 331 ("r3", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
332 ("r4", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 332 ("r4", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
333 ("r5", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 333 ("r5", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
334 ("r6", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 334 ("r6", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
335 ("r7", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 335 ("r7", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
336 ("r8", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 336 ("r8", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
337 ("r9", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 337 ("r9", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
338 ("r10", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), | 338 ("r10", EnableOnFlag(ctypes.c_uint32, MD_CONTEXT_ARM_INTEGER)), |
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 ", OBJDUMP_BIN | |
Jakob Kummerow
2015/06/03 10:41:49
nit:
print "Could not disassemble using %s." % OB
| |
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 |