Minidump (.dmp) reader.
| 616 | |
| 617 | |
| 618 | class MinidumpReader(object): |
| 619 | """Minidump (.dmp) reader.""" |
| 620 | |
| 621 | _HEADER_MAGIC = 0x504d444d |
| 622 | |
| 623 | def __init__(self, options, minidump_name): |
| 624 | self._reset() |
| 625 | self.minidump_name = minidump_name |
| 626 | if sys.platform == 'win32': |
| 627 | self.minidump_file = open(minidump_name, "a+") |
| 628 | self.minidump = mmap.mmap(self.minidump_file.fileno(), 0) |
| 629 | else: |
| 630 | self.minidump_file = open(minidump_name, "r") |
| 631 | self.minidump = mmap.mmap(self.minidump_file.fileno(), 0, mmap.MAP_PRIVATE) |
| 632 | self.header = MINIDUMP_HEADER.Read(self.minidump, 0) |
| 633 | if self.header.signature != MinidumpReader._HEADER_MAGIC: |
| 634 | print("Warning: Unsupported minidump header magic!", file=sys.stderr) |
| 635 | DebugPrint(self.header) |
| 636 | offset = self.header.stream_directories_rva |
| 637 | directories = [] |
| 638 | for _ in range(self.header.stream_count): |
| 639 | directories.append(MINIDUMP_DIRECTORY.Read(self.minidump, offset)) |
| 640 | offset += MINIDUMP_DIRECTORY.size |
| 641 | |
| 642 | self.symdir = options.symdir |
| 643 | self._ReadArchitecture(directories) |
| 644 | self._ReadDirectories(directories) |
| 645 | self._FindObjdump(options) |
| 646 | |
| 647 | def _reset(self): |
| 648 | self.header = None |
| 649 | self.arch = None |
| 650 | self.exception = None |
| 651 | self.exception_context = None |
| 652 | self.memory_list = None |
| 653 | self.memory_list64 = None |
| 654 | self.module_list = None |
| 655 | self.thread_map = {} |
| 656 | |
| 657 | self.modules_with_symbols = [] |
| 658 | self.symbols = [] |
| 659 | |
| 660 | |
| 661 | def _ReadArchitecture(self, directories): |
| 662 | # Find MDRawSystemInfo stream and determine arch. |
| 663 | for d in directories: |
| 664 | if d.stream_type == MD_SYSTEM_INFO_STREAM: |
| 665 | system_info = MINIDUMP_RAW_SYSTEM_INFO.Read( |
| 666 | self.minidump, d.location.rva) |
| 667 | self.arch = system_info.processor_architecture |
| 668 | if self.arch == MD_CPU_ARCHITECTURE_ARM64_BREAKPAD_LEGACY: |
| 669 | self.arch = MD_CPU_ARCHITECTURE_ARM64 |
| 670 | assert self.arch in [MD_CPU_ARCHITECTURE_AMD64, |
| 671 | MD_CPU_ARCHITECTURE_ARM, |
| 672 | MD_CPU_ARCHITECTURE_ARM64, |
| 673 | MD_CPU_ARCHITECTURE_X86] |
| 674 | assert not self.arch is None |
| 675 |
no outgoing calls
no test coverage detected