diff options
Diffstat (limited to 'examples/python/lldbtk.py')
| -rw-r--r-- | examples/python/lldbtk.py | 613 | 
1 files changed, 0 insertions, 613 deletions
diff --git a/examples/python/lldbtk.py b/examples/python/lldbtk.py deleted file mode 100644 index a978b9e070372..0000000000000 --- a/examples/python/lldbtk.py +++ /dev/null @@ -1,613 +0,0 @@ -#!/usr/bin/python - -import lldb -import shlex -import sys -from Tkinter import * -import ttk - - -class ValueTreeItemDelegate(object): - -    def __init__(self, value): -        self.value = value - -    def get_item_dictionary(self): -        name = self.value.name -        if name is None: -            name = '' -        typename = self.value.type -        if typename is None: -            typename = '' -        value = self.value.value -        if value is None: -            value = '' -        summary = self.value.summary -        if summary is None: -            summary = '' -        has_children = self.value.MightHaveChildren() -        return {'#0': name, -                'typename': typename, -                'value': value, -                'summary': summary, -                'children': has_children, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        for i in range(self.value.num_children): -            item_delegate = ValueTreeItemDelegate( -                self.value.GetChildAtIndex(i)) -            item_dicts.append(item_delegate.get_item_dictionary()) -        return item_dicts - - -class FrameTreeItemDelegate(object): - -    def __init__(self, frame): -        self.frame = frame - -    def get_item_dictionary(self): -        id = self.frame.GetFrameID() -        name = 'frame #%u' % (id) -        value = '0x%16.16x' % (self.frame.GetPC()) -        stream = lldb.SBStream() -        self.frame.GetDescription(stream) -        summary = stream.GetData().split("`")[1] -        return { -            '#0': name, -            'value': value, -            'summary': summary, -            'children': self.frame.GetVariables( -                True, -                True, -                True, -                True).GetSize() > 0, -            'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        variables = self.frame.GetVariables(True, True, True, True) -        n = variables.GetSize() -        for i in range(n): -            item_delegate = ValueTreeItemDelegate(variables[i]) -            item_dicts.append(item_delegate.get_item_dictionary()) -        return item_dicts - - -class ThreadTreeItemDelegate(object): - -    def __init__(self, thread): -        self.thread = thread - -    def get_item_dictionary(self): -        num_frames = self.thread.GetNumFrames() -        name = 'thread #%u' % (self.thread.GetIndexID()) -        value = '0x%x' % (self.thread.GetThreadID()) -        summary = '%u frames' % (num_frames) -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': num_frames > 0, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        for frame in self.thread: -            item_delegate = FrameTreeItemDelegate(frame) -            item_dicts.append(item_delegate.get_item_dictionary()) -        return item_dicts - - -class ProcessTreeItemDelegate(object): - -    def __init__(self, process): -        self.process = process - -    def get_item_dictionary(self): -        id = self.process.GetProcessID() -        num_threads = self.process.GetNumThreads() -        value = str(self.process.GetProcessID()) -        summary = self.process.target.executable.fullpath -        return {'#0': 'process', -                'value': value, -                'summary': summary, -                'children': num_threads > 0, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        for thread in self.process: -            item_delegate = ThreadTreeItemDelegate(thread) -            item_dicts.append(item_delegate.get_item_dictionary()) -        return item_dicts - - -class TargetTreeItemDelegate(object): - -    def __init__(self, target): -        self.target = target - -    def get_item_dictionary(self): -        value = str(self.target.triple) -        summary = self.target.executable.fullpath -        return {'#0': 'target', -                'value': value, -                'summary': summary, -                'children': True, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        image_item_delegate = TargetImagesTreeItemDelegate(self.target) -        item_dicts.append(image_item_delegate.get_item_dictionary()) -        return item_dicts - - -class TargetImagesTreeItemDelegate(object): - -    def __init__(self, target): -        self.target = target - -    def get_item_dictionary(self): -        value = str(self.target.triple) -        summary = self.target.executable.fullpath -        num_modules = self.target.GetNumModules() -        return {'#0': 'images', -                'value': '', -                'summary': '%u images' % num_modules, -                'children': num_modules > 0, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        for i in range(self.target.GetNumModules()): -            module = self.target.GetModuleAtIndex(i) -            image_item_delegate = ModuleTreeItemDelegate( -                self.target, module, i) -            item_dicts.append(image_item_delegate.get_item_dictionary()) -        return item_dicts - - -class ModuleTreeItemDelegate(object): - -    def __init__(self, target, module, index): -        self.target = target -        self.module = module -        self.index = index - -    def get_item_dictionary(self): -        name = 'module %u' % (self.index) -        value = self.module.file.basename -        summary = self.module.file.dirname -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': True, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        sections_item_delegate = ModuleSectionsTreeItemDelegate( -            self.target, self.module) -        item_dicts.append(sections_item_delegate.get_item_dictionary()) - -        symbols_item_delegate = ModuleSymbolsTreeItemDelegate( -            self.target, self.module) -        item_dicts.append(symbols_item_delegate.get_item_dictionary()) - -        comp_units_item_delegate = ModuleCompileUnitsTreeItemDelegate( -            self.target, self.module) -        item_dicts.append(comp_units_item_delegate.get_item_dictionary()) -        return item_dicts - - -class ModuleSectionsTreeItemDelegate(object): - -    def __init__(self, target, module): -        self.target = target -        self.module = module - -    def get_item_dictionary(self): -        name = 'sections' -        value = '' -        summary = '%u sections' % (self.module.GetNumSections()) -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': True, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        num_sections = self.module.GetNumSections() -        for i in range(num_sections): -            section = self.module.GetSectionAtIndex(i) -            image_item_delegate = SectionTreeItemDelegate(self.target, section) -            item_dicts.append(image_item_delegate.get_item_dictionary()) -        return item_dicts - - -class SectionTreeItemDelegate(object): - -    def __init__(self, target, section): -        self.target = target -        self.section = section - -    def get_item_dictionary(self): -        name = self.section.name -        section_load_addr = self.section.GetLoadAddress(self.target) -        if section_load_addr != lldb.LLDB_INVALID_ADDRESS: -            value = '0x%16.16x' % (section_load_addr) -        else: -            value = '0x%16.16x *' % (self.section.file_addr) -        summary = '' -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': self.section.GetNumSubSections() > 0, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        num_sections = self.section.GetNumSubSections() -        for i in range(num_sections): -            section = self.section.GetSubSectionAtIndex(i) -            image_item_delegate = SectionTreeItemDelegate(self.target, section) -            item_dicts.append(image_item_delegate.get_item_dictionary()) -        return item_dicts - - -class ModuleCompileUnitsTreeItemDelegate(object): - -    def __init__(self, target, module): -        self.target = target -        self.module = module - -    def get_item_dictionary(self): -        name = 'compile units' -        value = '' -        summary = '%u compile units' % (self.module.GetNumSections()) -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': self.module.GetNumCompileUnits() > 0, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        num_cus = self.module.GetNumCompileUnits() -        for i in range(num_cus): -            cu = self.module.GetCompileUnitAtIndex(i) -            image_item_delegate = CompileUnitTreeItemDelegate(self.target, cu) -            item_dicts.append(image_item_delegate.get_item_dictionary()) -        return item_dicts - - -class CompileUnitTreeItemDelegate(object): - -    def __init__(self, target, cu): -        self.target = target -        self.cu = cu - -    def get_item_dictionary(self): -        name = self.cu.GetFileSpec().basename -        value = '' -        num_lines = self.cu.GetNumLineEntries() -        summary = '' -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': num_lines > 0, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        item_delegate = LineTableTreeItemDelegate(self.target, self.cu) -        item_dicts.append(item_delegate.get_item_dictionary()) -        return item_dicts - - -class LineTableTreeItemDelegate(object): - -    def __init__(self, target, cu): -        self.target = target -        self.cu = cu - -    def get_item_dictionary(self): -        name = 'line table' -        value = '' -        num_lines = self.cu.GetNumLineEntries() -        summary = '%u line entries' % (num_lines) -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': num_lines > 0, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        num_lines = self.cu.GetNumLineEntries() -        for i in range(num_lines): -            line_entry = self.cu.GetLineEntryAtIndex(i) -            item_delegate = LineEntryTreeItemDelegate( -                self.target, line_entry, i) -            item_dicts.append(item_delegate.get_item_dictionary()) -        return item_dicts - - -class LineEntryTreeItemDelegate(object): - -    def __init__(self, target, line_entry, index): -        self.target = target -        self.line_entry = line_entry -        self.index = index - -    def get_item_dictionary(self): -        name = str(self.index) -        address = self.line_entry.GetStartAddress() -        load_addr = address.GetLoadAddress(self.target) -        if load_addr != lldb.LLDB_INVALID_ADDRESS: -            value = '0x%16.16x' % (load_addr) -        else: -            value = '0x%16.16x *' % (address.file_addr) -        summary = self.line_entry.GetFileSpec().fullpath + ':' + \ -            str(self.line_entry.line) -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': False, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        return item_dicts - - -class InstructionTreeItemDelegate(object): - -    def __init__(self, target, instr): -        self.target = target -        self.instr = instr - -    def get_item_dictionary(self): -        address = self.instr.GetAddress() -        load_addr = address.GetLoadAddress(self.target) -        if load_addr != lldb.LLDB_INVALID_ADDRESS: -            name = '0x%16.16x' % (load_addr) -        else: -            name = '0x%16.16x *' % (address.file_addr) -        value = self.instr.GetMnemonic( -            self.target) + ' ' + self.instr.GetOperands(self.target) -        summary = self.instr.GetComment(self.target) -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': False, -                'tree-item-delegate': self} - - -class ModuleSymbolsTreeItemDelegate(object): - -    def __init__(self, target, module): -        self.target = target -        self.module = module - -    def get_item_dictionary(self): -        name = 'symbols' -        value = '' -        summary = '%u symbols' % (self.module.GetNumSymbols()) -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': True, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        num_symbols = self.module.GetNumSymbols() -        for i in range(num_symbols): -            symbol = self.module.GetSymbolAtIndex(i) -            image_item_delegate = SymbolTreeItemDelegate( -                self.target, symbol, i) -            item_dicts.append(image_item_delegate.get_item_dictionary()) -        return item_dicts - - -class SymbolTreeItemDelegate(object): - -    def __init__(self, target, symbol, index): -        self.target = target -        self.symbol = symbol -        self.index = index - -    def get_item_dictionary(self): -        address = self.symbol.GetStartAddress() -        name = '[%u]' % self.index -        symbol_load_addr = address.GetLoadAddress(self.target) -        if symbol_load_addr != lldb.LLDB_INVALID_ADDRESS: -            value = '0x%16.16x' % (symbol_load_addr) -        else: -            value = '0x%16.16x *' % (address.file_addr) -        summary = self.symbol.name -        return {'#0': name, -                'value': value, -                'summary': summary, -                'children': False, -                'tree-item-delegate': self} - -    def get_child_item_dictionaries(self): -        item_dicts = list() -        return item_dicts - - -class DelegateTree(ttk.Frame): - -    def __init__(self, column_dicts, delegate, title, name): -        ttk.Frame.__init__(self, name=name) -        self.pack(expand=Y, fill=BOTH) -        self.master.title(title) -        self.delegate = delegate -        self.columns_dicts = column_dicts -        self.item_id_to_item_dict = dict() -        frame = Frame(self) -        frame.pack(side=TOP, fill=BOTH, expand=Y) -        self._create_treeview(frame) -        self._populate_root() - -    def _create_treeview(self, parent): -        frame = ttk.Frame(parent) -        frame.pack(side=TOP, fill=BOTH, expand=Y) - -        column_ids = list() -        for i in range(1, len(self.columns_dicts)): -            column_ids.append(self.columns_dicts[i]['id']) -        # create the tree and scrollbars -        self.tree = ttk.Treeview(columns=column_ids) - -        scroll_bar_v = ttk.Scrollbar(orient=VERTICAL, command=self.tree.yview) -        scroll_bar_h = ttk.Scrollbar( -            orient=HORIZONTAL, command=self.tree.xview) -        self.tree['yscroll'] = scroll_bar_v.set -        self.tree['xscroll'] = scroll_bar_h.set - -        # setup column headings and columns properties -        for columns_dict in self.columns_dicts: -            self.tree.heading( -                columns_dict['id'], -                text=columns_dict['text'], -                anchor=columns_dict['anchor']) -            self.tree.column( -                columns_dict['id'], -                stretch=columns_dict['stretch']) - -        # add tree and scrollbars to frame -        self.tree.grid(in_=frame, row=0, column=0, sticky=NSEW) -        scroll_bar_v.grid(in_=frame, row=0, column=1, sticky=NS) -        scroll_bar_h.grid(in_=frame, row=1, column=0, sticky=EW) - -        # set frame resizing priorities -        frame.rowconfigure(0, weight=1) -        frame.columnconfigure(0, weight=1) - -        # action to perform when a node is expanded -        self.tree.bind('<<TreeviewOpen>>', self._update_tree) - -    def insert_items(self, parent_id, item_dicts): -        for item_dict in item_dicts: -            name = None -            values = list() -            first = True -            for columns_dict in self.columns_dicts: -                if first: -                    name = item_dict[columns_dict['id']] -                    first = False -                else: -                    values.append(item_dict[columns_dict['id']]) -            item_id = self.tree.insert(parent_id,  # root item has an empty name -                                       END, -                                       text=name, -                                       values=values) -            self.item_id_to_item_dict[item_id] = item_dict -            if item_dict['children']: -                self.tree.insert(item_id, END, text='dummy') - -    def _populate_root(self): -        # use current directory as root node -        self.insert_items('', self.delegate.get_child_item_dictionaries()) - -    def _update_tree(self, event): -        # user expanded a node - build the related directory -        item_id = self.tree.focus()      # the id of the expanded node -        children = self.tree.get_children(item_id) -        if len(children): -            first_child = children[0] -            # if the node only has a 'dummy' child, remove it and -            # build new directory; skip if the node is already -            # populated -            if self.tree.item(first_child, option='text') == 'dummy': -                self.tree.delete(first_child) -                item_dict = self.item_id_to_item_dict[item_id] -                item_dicts = item_dict[ -                    'tree-item-delegate'].get_child_item_dictionaries() -                self.insert_items(item_id, item_dicts) - - -@lldb.command("tk-variables") -def tk_variable_display(debugger, command, result, dict): -    # needed for tree creation in TK library as it uses sys.argv... -    sys.argv = ['tk-variables'] -    target = debugger.GetSelectedTarget() -    if not target: -        print >>result, "invalid target" -        return -    process = target.GetProcess() -    if not process: -        print >>result, "invalid process" -        return -    thread = process.GetSelectedThread() -    if not thread: -        print >>result, "invalid thread" -        return -    frame = thread.GetSelectedFrame() -    if not frame: -        print >>result, "invalid frame" -        return -    # Parse command line args -    command_args = shlex.split(command) -    column_dicts = [{'id': '#0', 'text': 'Name', 'anchor': W, 'stretch': 0}, -                    {'id': 'typename', 'text': 'Type', 'anchor': W, 'stretch': 0}, -                    {'id': 'value', 'text': 'Value', 'anchor': W, 'stretch': 0}, -                    {'id': 'summary', 'text': 'Summary', 'anchor': W, 'stretch': 1}] -    tree = DelegateTree( -        column_dicts, -        FrameTreeItemDelegate(frame), -        'Variables', -        'lldb-tk-variables') -    tree.mainloop() - - -@lldb.command("tk-process") -def tk_process_display(debugger, command, result, dict): -    # needed for tree creation in TK library as it uses sys.argv... -    sys.argv = ['tk-process'] -    target = debugger.GetSelectedTarget() -    if not target: -        print >>result, "invalid target" -        return -    process = target.GetProcess() -    if not process: -        print >>result, "invalid process" -        return -    # Parse command line args -    columnd_dicts = [{'id': '#0', 'text': 'Name', 'anchor': W, 'stretch': 0}, -                     {'id': 'value', 'text': 'Value', 'anchor': W, 'stretch': 0}, -                     {'id': 'summary', 'text': 'Summary', 'anchor': W, 'stretch': 1}] -    command_args = shlex.split(command) -    tree = DelegateTree( -        columnd_dicts, -        ProcessTreeItemDelegate(process), -        'Process', -        'lldb-tk-process') -    tree.mainloop() - - -@lldb.command("tk-target") -def tk_target_display(debugger, command, result, dict): -    # needed for tree creation in TK library as it uses sys.argv... -    sys.argv = ['tk-target'] -    target = debugger.GetSelectedTarget() -    if not target: -        print >>result, "invalid target" -        return -    # Parse command line args -    columnd_dicts = [{'id': '#0', 'text': 'Name', 'anchor': W, 'stretch': 0}, -                     {'id': 'value', 'text': 'Value', 'anchor': W, 'stretch': 0}, -                     {'id': 'summary', 'text': 'Summary', 'anchor': W, 'stretch': 1}] -    command_args = shlex.split(command) -    tree = DelegateTree( -        columnd_dicts, -        TargetTreeItemDelegate(target), -        'Target', -        'lldb-tk-target') -    tree.mainloop()  | 
