Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | |
| 3 | import lldb |
| 4 | import shlex |
| 5 | import sys |
| 6 | from Tkinter import * |
| 7 | import ttk |
| 8 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 9 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 10 | class ValueTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 11 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 12 | def __init__(self, value): |
| 13 | self.value = value |
| 14 | |
| 15 | def get_item_dictionary(self): |
| 16 | name = self.value.name |
| 17 | if name is None: |
| 18 | name = '' |
| 19 | typename = self.value.type |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 20 | if typename is None: |
| 21 | typename = '' |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 22 | value = self.value.value |
| 23 | if value is None: |
| 24 | value = '' |
| 25 | summary = self.value.summary |
| 26 | if summary is None: |
| 27 | summary = '' |
| 28 | has_children = self.value.MightHaveChildren() |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 29 | return {'#0': name, |
| 30 | 'typename': typename, |
| 31 | 'value': value, |
| 32 | 'summary': summary, |
| 33 | 'children': has_children, |
| 34 | 'tree-item-delegate': self} |
| 35 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 36 | def get_child_item_dictionaries(self): |
| 37 | item_dicts = list() |
| 38 | for i in range(self.value.num_children): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 39 | item_delegate = ValueTreeItemDelegate( |
| 40 | self.value.GetChildAtIndex(i)) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 41 | item_dicts.append(item_delegate.get_item_dictionary()) |
| 42 | return item_dicts |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 43 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 44 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 45 | class FrameTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 46 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 47 | def __init__(self, frame): |
| 48 | self.frame = frame |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 49 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 50 | def get_item_dictionary(self): |
| 51 | id = self.frame.GetFrameID() |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 52 | name = 'frame #%u' % (id) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 53 | value = '0x%16.16x' % (self.frame.GetPC()) |
| 54 | stream = lldb.SBStream() |
| 55 | self.frame.GetDescription(stream) |
| 56 | summary = stream.GetData().split("`")[1] |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 57 | return { |
| 58 | '#0': name, |
| 59 | 'value': value, |
| 60 | 'summary': summary, |
| 61 | 'children': self.frame.GetVariables( |
| 62 | True, |
| 63 | True, |
| 64 | True, |
| 65 | True).GetSize() > 0, |
| 66 | 'tree-item-delegate': self} |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 67 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 68 | def get_child_item_dictionaries(self): |
| 69 | item_dicts = list() |
| 70 | variables = self.frame.GetVariables(True, True, True, True) |
| 71 | n = variables.GetSize() |
| 72 | for i in range(n): |
| 73 | item_delegate = ValueTreeItemDelegate(variables[i]) |
| 74 | item_dicts.append(item_delegate.get_item_dictionary()) |
| 75 | return item_dicts |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 76 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 77 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 78 | class ThreadTreeItemDelegate(object): |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 79 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 80 | def __init__(self, thread): |
| 81 | self.thread = thread |
| 82 | |
| 83 | def get_item_dictionary(self): |
| 84 | num_frames = self.thread.GetNumFrames() |
| 85 | name = 'thread #%u' % (self.thread.GetIndexID()) |
| 86 | value = '0x%x' % (self.thread.GetThreadID()) |
| 87 | summary = '%u frames' % (num_frames) |
| 88 | return {'#0': name, |
| 89 | 'value': value, |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 90 | 'summary': summary, |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 91 | 'children': num_frames > 0, |
| 92 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 93 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 94 | def get_child_item_dictionaries(self): |
| 95 | item_dicts = list() |
| 96 | for frame in self.thread: |
| 97 | item_delegate = FrameTreeItemDelegate(frame) |
| 98 | item_dicts.append(item_delegate.get_item_dictionary()) |
| 99 | return item_dicts |
| 100 | |
| 101 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 102 | class ProcessTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 103 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 104 | def __init__(self, process): |
| 105 | self.process = process |
| 106 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 107 | def get_item_dictionary(self): |
| 108 | id = self.process.GetProcessID() |
| 109 | num_threads = self.process.GetNumThreads() |
| 110 | value = str(self.process.GetProcessID()) |
| 111 | summary = self.process.target.executable.fullpath |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 112 | return {'#0': 'process', |
| 113 | 'value': value, |
| 114 | 'summary': summary, |
| 115 | 'children': num_threads > 0, |
| 116 | 'tree-item-delegate': self} |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 117 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 118 | def get_child_item_dictionaries(self): |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 119 | item_dicts = list() |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 120 | for thread in self.process: |
| 121 | item_delegate = ThreadTreeItemDelegate(thread) |
| 122 | item_dicts.append(item_delegate.get_item_dictionary()) |
| 123 | return item_dicts |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 124 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 125 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 126 | class TargetTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 127 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 128 | def __init__(self, target): |
| 129 | self.target = target |
| 130 | |
| 131 | def get_item_dictionary(self): |
| 132 | value = str(self.target.triple) |
| 133 | summary = self.target.executable.fullpath |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 134 | return {'#0': 'target', |
| 135 | 'value': value, |
| 136 | 'summary': summary, |
| 137 | 'children': True, |
| 138 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 139 | |
| 140 | def get_child_item_dictionaries(self): |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 141 | item_dicts = list() |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 142 | image_item_delegate = TargetImagesTreeItemDelegate(self.target) |
| 143 | item_dicts.append(image_item_delegate.get_item_dictionary()) |
| 144 | return item_dicts |
| 145 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 146 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 147 | class TargetImagesTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 148 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 149 | def __init__(self, target): |
| 150 | self.target = target |
| 151 | |
| 152 | def get_item_dictionary(self): |
| 153 | value = str(self.target.triple) |
| 154 | summary = self.target.executable.fullpath |
| 155 | num_modules = self.target.GetNumModules() |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 156 | return {'#0': 'images', |
| 157 | 'value': '', |
| 158 | 'summary': '%u images' % num_modules, |
| 159 | 'children': num_modules > 0, |
| 160 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 161 | |
| 162 | def get_child_item_dictionaries(self): |
| 163 | item_dicts = list() |
| 164 | for i in range(self.target.GetNumModules()): |
| 165 | module = self.target.GetModuleAtIndex(i) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 166 | image_item_delegate = ModuleTreeItemDelegate( |
| 167 | self.target, module, i) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 168 | item_dicts.append(image_item_delegate.get_item_dictionary()) |
| 169 | return item_dicts |
| 170 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 171 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 172 | class ModuleTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 173 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 174 | def __init__(self, target, module, index): |
| 175 | self.target = target |
| 176 | self.module = module |
| 177 | self.index = index |
| 178 | |
| 179 | def get_item_dictionary(self): |
| 180 | name = 'module %u' % (self.index) |
| 181 | value = self.module.file.basename |
| 182 | summary = self.module.file.dirname |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 183 | return {'#0': name, |
| 184 | 'value': value, |
| 185 | 'summary': summary, |
| 186 | 'children': True, |
| 187 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 188 | |
| 189 | def get_child_item_dictionaries(self): |
| 190 | item_dicts = list() |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 191 | sections_item_delegate = ModuleSectionsTreeItemDelegate( |
| 192 | self.target, self.module) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 193 | item_dicts.append(sections_item_delegate.get_item_dictionary()) |
| 194 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 195 | symbols_item_delegate = ModuleSymbolsTreeItemDelegate( |
| 196 | self.target, self.module) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 197 | item_dicts.append(symbols_item_delegate.get_item_dictionary()) |
| 198 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 199 | comp_units_item_delegate = ModuleCompileUnitsTreeItemDelegate( |
| 200 | self.target, self.module) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 201 | item_dicts.append(comp_units_item_delegate.get_item_dictionary()) |
| 202 | return item_dicts |
| 203 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 204 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 205 | class ModuleSectionsTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 206 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 207 | def __init__(self, target, module): |
| 208 | self.target = target |
| 209 | self.module = module |
| 210 | |
| 211 | def get_item_dictionary(self): |
| 212 | name = 'sections' |
| 213 | value = '' |
| 214 | summary = '%u sections' % (self.module.GetNumSections()) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 215 | return {'#0': name, |
| 216 | 'value': value, |
| 217 | 'summary': summary, |
| 218 | 'children': True, |
| 219 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 220 | |
| 221 | def get_child_item_dictionaries(self): |
| 222 | item_dicts = list() |
| 223 | num_sections = self.module.GetNumSections() |
| 224 | for i in range(num_sections): |
| 225 | section = self.module.GetSectionAtIndex(i) |
| 226 | image_item_delegate = SectionTreeItemDelegate(self.target, section) |
| 227 | item_dicts.append(image_item_delegate.get_item_dictionary()) |
| 228 | return item_dicts |
| 229 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 230 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 231 | class SectionTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 232 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 233 | def __init__(self, target, section): |
| 234 | self.target = target |
| 235 | self.section = section |
| 236 | |
| 237 | def get_item_dictionary(self): |
| 238 | name = self.section.name |
| 239 | section_load_addr = self.section.GetLoadAddress(self.target) |
| 240 | if section_load_addr != lldb.LLDB_INVALID_ADDRESS: |
| 241 | value = '0x%16.16x' % (section_load_addr) |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 242 | else: |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 243 | value = '0x%16.16x *' % (self.section.file_addr) |
| 244 | summary = '' |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 245 | return {'#0': name, |
| 246 | 'value': value, |
| 247 | 'summary': summary, |
| 248 | 'children': self.section.GetNumSubSections() > 0, |
| 249 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 250 | |
| 251 | def get_child_item_dictionaries(self): |
| 252 | item_dicts = list() |
| 253 | num_sections = self.section.GetNumSubSections() |
| 254 | for i in range(num_sections): |
| 255 | section = self.section.GetSubSectionAtIndex(i) |
| 256 | image_item_delegate = SectionTreeItemDelegate(self.target, section) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 257 | item_dicts.append(image_item_delegate.get_item_dictionary()) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 258 | return item_dicts |
| 259 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 260 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 261 | class ModuleCompileUnitsTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 262 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 263 | def __init__(self, target, module): |
| 264 | self.target = target |
| 265 | self.module = module |
| 266 | |
| 267 | def get_item_dictionary(self): |
| 268 | name = 'compile units' |
| 269 | value = '' |
| 270 | summary = '%u compile units' % (self.module.GetNumSections()) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 271 | return {'#0': name, |
| 272 | 'value': value, |
| 273 | 'summary': summary, |
| 274 | 'children': self.module.GetNumCompileUnits() > 0, |
| 275 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 276 | |
| 277 | def get_child_item_dictionaries(self): |
| 278 | item_dicts = list() |
| 279 | num_cus = self.module.GetNumCompileUnits() |
| 280 | for i in range(num_cus): |
| 281 | cu = self.module.GetCompileUnitAtIndex(i) |
| 282 | image_item_delegate = CompileUnitTreeItemDelegate(self.target, cu) |
| 283 | item_dicts.append(image_item_delegate.get_item_dictionary()) |
| 284 | return item_dicts |
| 285 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 286 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 287 | class CompileUnitTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 288 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 289 | def __init__(self, target, cu): |
| 290 | self.target = target |
| 291 | self.cu = cu |
| 292 | |
| 293 | def get_item_dictionary(self): |
| 294 | name = self.cu.GetFileSpec().basename |
| 295 | value = '' |
| 296 | num_lines = self.cu.GetNumLineEntries() |
| 297 | summary = '' |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 298 | return {'#0': name, |
| 299 | 'value': value, |
| 300 | 'summary': summary, |
| 301 | 'children': num_lines > 0, |
| 302 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 303 | |
| 304 | def get_child_item_dictionaries(self): |
| 305 | item_dicts = list() |
| 306 | item_delegate = LineTableTreeItemDelegate(self.target, self.cu) |
| 307 | item_dicts.append(item_delegate.get_item_dictionary()) |
| 308 | return item_dicts |
| 309 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 310 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 311 | class LineTableTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 312 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 313 | def __init__(self, target, cu): |
| 314 | self.target = target |
| 315 | self.cu = cu |
| 316 | |
| 317 | def get_item_dictionary(self): |
| 318 | name = 'line table' |
| 319 | value = '' |
| 320 | num_lines = self.cu.GetNumLineEntries() |
| 321 | summary = '%u line entries' % (num_lines) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 322 | return {'#0': name, |
| 323 | 'value': value, |
| 324 | 'summary': summary, |
| 325 | 'children': num_lines > 0, |
| 326 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 327 | |
| 328 | def get_child_item_dictionaries(self): |
| 329 | item_dicts = list() |
| 330 | num_lines = self.cu.GetNumLineEntries() |
| 331 | for i in range(num_lines): |
| 332 | line_entry = self.cu.GetLineEntryAtIndex(i) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 333 | item_delegate = LineEntryTreeItemDelegate( |
| 334 | self.target, line_entry, i) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 335 | item_dicts.append(item_delegate.get_item_dictionary()) |
| 336 | return item_dicts |
| 337 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 338 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 339 | class LineEntryTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 340 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 341 | def __init__(self, target, line_entry, index): |
| 342 | self.target = target |
| 343 | self.line_entry = line_entry |
| 344 | self.index = index |
| 345 | |
| 346 | def get_item_dictionary(self): |
| 347 | name = str(self.index) |
| 348 | address = self.line_entry.GetStartAddress() |
| 349 | load_addr = address.GetLoadAddress(self.target) |
| 350 | if load_addr != lldb.LLDB_INVALID_ADDRESS: |
| 351 | value = '0x%16.16x' % (load_addr) |
| 352 | else: |
| 353 | value = '0x%16.16x *' % (address.file_addr) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 354 | summary = self.line_entry.GetFileSpec().fullpath + ':' + \ |
| 355 | str(self.line_entry.line) |
| 356 | return {'#0': name, |
| 357 | 'value': value, |
| 358 | 'summary': summary, |
| 359 | 'children': False, |
| 360 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 361 | |
| 362 | def get_child_item_dictionaries(self): |
| 363 | item_dicts = list() |
| 364 | return item_dicts |
| 365 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 366 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 367 | class InstructionTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 368 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 369 | def __init__(self, target, instr): |
| 370 | self.target = target |
| 371 | self.instr = instr |
| 372 | |
| 373 | def get_item_dictionary(self): |
| 374 | address = self.instr.GetAddress() |
| 375 | load_addr = address.GetLoadAddress(self.target) |
| 376 | if load_addr != lldb.LLDB_INVALID_ADDRESS: |
| 377 | name = '0x%16.16x' % (load_addr) |
| 378 | else: |
| 379 | name = '0x%16.16x *' % (address.file_addr) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 380 | value = self.instr.GetMnemonic( |
| 381 | self.target) + ' ' + self.instr.GetOperands(self.target) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 382 | summary = self.instr.GetComment(self.target) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 383 | return {'#0': name, |
| 384 | 'value': value, |
| 385 | 'summary': summary, |
| 386 | 'children': False, |
| 387 | 'tree-item-delegate': self} |
| 388 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 389 | |
| 390 | class ModuleSymbolsTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 391 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 392 | def __init__(self, target, module): |
| 393 | self.target = target |
| 394 | self.module = module |
| 395 | |
| 396 | def get_item_dictionary(self): |
| 397 | name = 'symbols' |
| 398 | value = '' |
| 399 | summary = '%u symbols' % (self.module.GetNumSymbols()) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 400 | return {'#0': name, |
| 401 | 'value': value, |
| 402 | 'summary': summary, |
| 403 | 'children': True, |
| 404 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 405 | |
| 406 | def get_child_item_dictionaries(self): |
| 407 | item_dicts = list() |
| 408 | num_symbols = self.module.GetNumSymbols() |
| 409 | for i in range(num_symbols): |
| 410 | symbol = self.module.GetSymbolAtIndex(i) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 411 | image_item_delegate = SymbolTreeItemDelegate( |
| 412 | self.target, symbol, i) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 413 | item_dicts.append(image_item_delegate.get_item_dictionary()) |
| 414 | return item_dicts |
| 415 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 416 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 417 | class SymbolTreeItemDelegate(object): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 418 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 419 | def __init__(self, target, symbol, index): |
| 420 | self.target = target |
| 421 | self.symbol = symbol |
| 422 | self.index = index |
| 423 | |
| 424 | def get_item_dictionary(self): |
| 425 | address = self.symbol.GetStartAddress() |
| 426 | name = '[%u]' % self.index |
| 427 | symbol_load_addr = address.GetLoadAddress(self.target) |
| 428 | if symbol_load_addr != lldb.LLDB_INVALID_ADDRESS: |
| 429 | value = '0x%16.16x' % (symbol_load_addr) |
| 430 | else: |
| 431 | value = '0x%16.16x *' % (address.file_addr) |
| 432 | summary = self.symbol.name |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 433 | return {'#0': name, |
| 434 | 'value': value, |
| 435 | 'summary': summary, |
| 436 | 'children': False, |
| 437 | 'tree-item-delegate': self} |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 438 | |
| 439 | def get_child_item_dictionaries(self): |
| 440 | item_dicts = list() |
| 441 | return item_dicts |
| 442 | |
| 443 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 444 | class DelegateTree(ttk.Frame): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 445 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 446 | def __init__(self, column_dicts, delegate, title, name): |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 447 | ttk.Frame.__init__(self, name=name) |
| 448 | self.pack(expand=Y, fill=BOTH) |
| 449 | self.master.title(title) |
| 450 | self.delegate = delegate |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 451 | self.columns_dicts = column_dicts |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 452 | self.item_id_to_item_dict = dict() |
| 453 | frame = Frame(self) |
| 454 | frame.pack(side=TOP, fill=BOTH, expand=Y) |
| 455 | self._create_treeview(frame) |
| 456 | self._populate_root() |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 457 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 458 | def _create_treeview(self, parent): |
| 459 | frame = ttk.Frame(parent) |
| 460 | frame.pack(side=TOP, fill=BOTH, expand=Y) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 461 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 462 | column_ids = list() |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 463 | for i in range(1, len(self.columns_dicts)): |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 464 | column_ids.append(self.columns_dicts[i]['id']) |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 465 | # create the tree and scrollbars |
| 466 | self.tree = ttk.Treeview(columns=column_ids) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 467 | |
| 468 | scroll_bar_v = ttk.Scrollbar(orient=VERTICAL, command=self.tree.yview) |
| 469 | scroll_bar_h = ttk.Scrollbar( |
| 470 | orient=HORIZONTAL, command=self.tree.xview) |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 471 | self.tree['yscroll'] = scroll_bar_v.set |
| 472 | self.tree['xscroll'] = scroll_bar_h.set |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 473 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 474 | # setup column headings and columns properties |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 475 | for columns_dict in self.columns_dicts: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 476 | self.tree.heading( |
| 477 | columns_dict['id'], |
| 478 | text=columns_dict['text'], |
| 479 | anchor=columns_dict['anchor']) |
| 480 | self.tree.column( |
| 481 | columns_dict['id'], |
| 482 | stretch=columns_dict['stretch']) |
| 483 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 484 | # add tree and scrollbars to frame |
| 485 | self.tree.grid(in_=frame, row=0, column=0, sticky=NSEW) |
| 486 | scroll_bar_v.grid(in_=frame, row=0, column=1, sticky=NS) |
| 487 | scroll_bar_h.grid(in_=frame, row=1, column=0, sticky=EW) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 488 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 489 | # set frame resizing priorities |
| 490 | frame.rowconfigure(0, weight=1) |
| 491 | frame.columnconfigure(0, weight=1) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 492 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 493 | # action to perform when a node is expanded |
| 494 | self.tree.bind('<<TreeviewOpen>>', self._update_tree) |
| 495 | |
| 496 | def insert_items(self, parent_id, item_dicts): |
| 497 | for item_dict in item_dicts: |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 498 | name = None |
| 499 | values = list() |
| 500 | first = True |
| 501 | for columns_dict in self.columns_dicts: |
| 502 | if first: |
| 503 | name = item_dict[columns_dict['id']] |
| 504 | first = False |
| 505 | else: |
| 506 | values.append(item_dict[columns_dict['id']]) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 507 | item_id = self.tree.insert(parent_id, # root item has an empty name |
| 508 | END, |
| 509 | text=name, |
| 510 | values=values) |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 511 | self.item_id_to_item_dict[item_id] = item_dict |
| 512 | if item_dict['children']: |
| 513 | self.tree.insert(item_id, END, text='dummy') |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 514 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 515 | def _populate_root(self): |
| 516 | # use current directory as root node |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 517 | self.insert_items('', self.delegate.get_child_item_dictionaries()) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 518 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 519 | def _update_tree(self, event): |
| 520 | # user expanded a node - build the related directory |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 521 | item_id = self.tree.focus() # the id of the expanded node |
| 522 | children = self.tree.get_children(item_id) |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 523 | if len(children): |
| 524 | first_child = children[0] |
| 525 | # if the node only has a 'dummy' child, remove it and |
| 526 | # build new directory; skip if the node is already |
| 527 | # populated |
| 528 | if self.tree.item(first_child, option='text') == 'dummy': |
| 529 | self.tree.delete(first_child) |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 530 | item_dict = self.item_id_to_item_dict[item_id] |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 531 | item_dicts = item_dict[ |
| 532 | 'tree-item-delegate'].get_child_item_dictionaries() |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 533 | self.insert_items(item_id, item_dicts) |
| 534 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 535 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 536 | @lldb.command("tk-variables") |
| 537 | def tk_variable_display(debugger, command, result, dict): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 538 | # needed for tree creation in TK library as it uses sys.argv... |
| 539 | sys.argv = ['tk-variables'] |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 540 | target = debugger.GetSelectedTarget() |
| 541 | if not target: |
| 542 | print >>result, "invalid target" |
| 543 | return |
| 544 | process = target.GetProcess() |
| 545 | if not process: |
| 546 | print >>result, "invalid process" |
| 547 | return |
| 548 | thread = process.GetSelectedThread() |
| 549 | if not thread: |
| 550 | print >>result, "invalid thread" |
| 551 | return |
| 552 | frame = thread.GetSelectedFrame() |
| 553 | if not frame: |
| 554 | print >>result, "invalid frame" |
| 555 | return |
| 556 | # Parse command line args |
| 557 | command_args = shlex.split(command) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 558 | column_dicts = [{'id': '#0', 'text': 'Name', 'anchor': W, 'stretch': 0}, |
| 559 | {'id': 'typename', 'text': 'Type', 'anchor': W, 'stretch': 0}, |
| 560 | {'id': 'value', 'text': 'Value', 'anchor': W, 'stretch': 0}, |
| 561 | {'id': 'summary', 'text': 'Summary', 'anchor': W, 'stretch': 1}] |
| 562 | tree = DelegateTree( |
| 563 | column_dicts, |
| 564 | FrameTreeItemDelegate(frame), |
| 565 | 'Variables', |
| 566 | 'lldb-tk-variables') |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 567 | tree.mainloop() |
| 568 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 569 | |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 570 | @lldb.command("tk-process") |
| 571 | def tk_process_display(debugger, command, result, dict): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 572 | # needed for tree creation in TK library as it uses sys.argv... |
| 573 | sys.argv = ['tk-process'] |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 574 | target = debugger.GetSelectedTarget() |
| 575 | if not target: |
| 576 | print >>result, "invalid target" |
| 577 | return |
| 578 | process = target.GetProcess() |
| 579 | if not process: |
| 580 | print >>result, "invalid process" |
| 581 | return |
| 582 | # Parse command line args |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 583 | columnd_dicts = [{'id': '#0', 'text': 'Name', 'anchor': W, 'stretch': 0}, |
| 584 | {'id': 'value', 'text': 'Value', 'anchor': W, 'stretch': 0}, |
| 585 | {'id': 'summary', 'text': 'Summary', 'anchor': W, 'stretch': 1}] |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 586 | command_args = shlex.split(command) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 587 | tree = DelegateTree( |
| 588 | columnd_dicts, |
| 589 | ProcessTreeItemDelegate(process), |
| 590 | 'Process', |
| 591 | 'lldb-tk-process') |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 592 | tree.mainloop() |
| 593 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 594 | |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 595 | @lldb.command("tk-target") |
| 596 | def tk_target_display(debugger, command, result, dict): |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 597 | # needed for tree creation in TK library as it uses sys.argv... |
| 598 | sys.argv = ['tk-target'] |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 599 | target = debugger.GetSelectedTarget() |
| 600 | if not target: |
| 601 | print >>result, "invalid target" |
| 602 | return |
| 603 | # Parse command line args |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 604 | columnd_dicts = [{'id': '#0', 'text': 'Name', 'anchor': W, 'stretch': 0}, |
| 605 | {'id': 'value', 'text': 'Value', 'anchor': W, 'stretch': 0}, |
| 606 | {'id': 'summary', 'text': 'Summary', 'anchor': W, 'stretch': 1}] |
Greg Clayton | 2f54717 | 2014-10-07 17:30:23 +0000 | [diff] [blame] | 607 | command_args = shlex.split(command) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 608 | tree = DelegateTree( |
| 609 | columnd_dicts, |
| 610 | TargetTreeItemDelegate(target), |
| 611 | 'Target', |
| 612 | 'lldb-tk-target') |
Greg Clayton | 994ba64 | 2014-09-22 22:06:41 +0000 | [diff] [blame] | 613 | tree.mainloop() |