| 2877 | |
| 2878 | |
| 2879 | class InspectionWebFormatter(object): |
| 2880 | CONTEXT_FULL = 0 |
| 2881 | CONTEXT_SHORT = 1 |
| 2882 | |
| 2883 | def __init__(self, switches, minidump_name, http_server): |
| 2884 | self.dumpfilename = os.path.split(minidump_name)[1] |
| 2885 | self.encfilename = urllib.parse.urlencode({'dump': self.dumpfilename}) |
| 2886 | self.reader = MinidumpReader(switches, minidump_name) |
| 2887 | self.server = http_server |
| 2888 | |
| 2889 | # Set up the heap |
| 2890 | exception_thread = self.reader.thread_map[self.reader.exception.thread_id] |
| 2891 | stack_top = self.reader.ExceptionSP() |
| 2892 | stack_bottom = exception_thread.stack.start + \ |
| 2893 | exception_thread.stack.memory.data_size |
| 2894 | stack_map = {self.reader.ExceptionIP(): -1} |
| 2895 | for slot in range(stack_top, stack_bottom, |
| 2896 | self.reader.MachinePointerSize()): |
| 2897 | maybe_address = self.reader.ReadUIntPtr(slot) |
| 2898 | if not maybe_address in stack_map: |
| 2899 | stack_map[maybe_address] = slot |
| 2900 | self.heap = V8Heap(self.reader, stack_map) |
| 2901 | |
| 2902 | self.padawan = InspectionPadawan(self.reader, self.heap) |
| 2903 | self.comments = InspectionInfo(minidump_name, self.reader) |
| 2904 | self.padawan.known_first_old_page = ( |
| 2905 | self.comments.get_page_address("oldpage")) |
| 2906 | self.padawan.known_first_map_page = ( |
| 2907 | self.comments.get_page_address("mappage")) |
| 2908 | |
| 2909 | def set_comment(self, straddress, comment): |
| 2910 | try: |
| 2911 | address = int(straddress, 0) |
| 2912 | self.comments.set_comment(address, comment) |
| 2913 | except ValueError: |
| 2914 | print("Invalid address") |
| 2915 | |
| 2916 | def set_page_address(self, kind, straddress): |
| 2917 | try: |
| 2918 | address = int(straddress, 0) |
| 2919 | if kind == "oldpage": |
| 2920 | self.padawan.known_first_old_page = address |
| 2921 | elif kind == "mappage": |
| 2922 | self.padawan.known_first_map_page = address |
| 2923 | self.comments.save_page_address(kind, address) |
| 2924 | except ValueError: |
| 2925 | print("Invalid address") |
| 2926 | |
| 2927 | def td_from_address(self, f, address): |
| 2928 | f.write("<td %s>" % self.comments.get_style_class_string(address)) |
| 2929 | |
| 2930 | def format_address(self, maybeaddress, straddress = None): |
| 2931 | if maybeaddress is None: |
| 2932 | return "not in dump" |
| 2933 | else: |
| 2934 | if straddress is None: |
| 2935 | straddress = "0x" + self.reader.FormatIntPtr(maybeaddress) |
| 2936 | style_class = "" |
no outgoing calls
no test coverage detected