| 2009 | |
| 2010 | |
| 2011 | class InspectionInfo(object): |
| 2012 | def __init__(self, minidump_name, reader): |
| 2013 | self.comment_file = minidump_name + ".comments" |
| 2014 | self.address_comments = {} |
| 2015 | self.page_address = {} |
| 2016 | if os.path.exists(self.comment_file): |
| 2017 | with open(self.comment_file, "r") as f: |
| 2018 | lines = f.readlines() |
| 2019 | f.close() |
| 2020 | |
| 2021 | for l in lines: |
| 2022 | m = COMMENT_RE.match(l) |
| 2023 | if m: |
| 2024 | self.address_comments[int(m.group(1), 0)] = m.group(2) |
| 2025 | m = PAGEADDRESS_RE.match(l) |
| 2026 | if m: |
| 2027 | self.page_address[m.group(1)] = int(m.group(2), 0) |
| 2028 | self.reader = reader |
| 2029 | self.styles = {} |
| 2030 | self.color_addresses() |
| 2031 | return |
| 2032 | |
| 2033 | def get_page_address(self, page_kind): |
| 2034 | return self.page_address.get(page_kind, 0) |
| 2035 | |
| 2036 | def save_page_address(self, page_kind, address): |
| 2037 | with open(self.comment_file, "a") as f: |
| 2038 | f.write("P %s 0x%x\n" % (page_kind, address)) |
| 2039 | f.close() |
| 2040 | |
| 2041 | def color_addresses(self): |
| 2042 | # Color all stack addresses. |
| 2043 | exception_thread = self.reader.thread_map[self.reader.exception.thread_id] |
| 2044 | stack_top = self.reader.ExceptionSP() |
| 2045 | stack_bottom = exception_thread.stack.start + \ |
| 2046 | exception_thread.stack.memory.data_size |
| 2047 | frame_pointer = self.reader.ExceptionFP() |
| 2048 | self.styles[frame_pointer] = "frame" |
| 2049 | for slot in range(stack_top, stack_bottom, |
| 2050 | self.reader.MachinePointerSize()): |
| 2051 | # stack address |
| 2052 | self.styles[slot] = "sa" |
| 2053 | for slot in range(stack_top, stack_bottom, |
| 2054 | self.reader.MachinePointerSize()): |
| 2055 | maybe_address = self.reader.ReadUIntPtr(slot) |
| 2056 | # stack value |
| 2057 | self.styles[maybe_address] = "sv" |
| 2058 | if slot == frame_pointer: |
| 2059 | self.styles[slot] = "frame" |
| 2060 | frame_pointer = maybe_address |
| 2061 | self.styles[self.reader.ExceptionIP()] = "pc" |
| 2062 | |
| 2063 | def get_style_class(self, address): |
| 2064 | return self.styles.get(address, None) |
| 2065 | |
| 2066 | def get_style_class_string(self, address): |
| 2067 | style = self.get_style_class(address) |
| 2068 | if style is not None: |
no outgoing calls
no test coverage detected
searching dependent graphs…