94 lines · python
1##===-- breakwin.py ------------------------------------------*- Python -*-===##2##3# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4# See https://llvm.org/LICENSE.txt for license information.5# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6##7##===----------------------------------------------------------------------===##8 9import cui10import curses11import lldb12import lldbutil13import re14 15 16class BreakWin(cui.ListWin):17 def __init__(self, driver, x, y, w, h):18 super(BreakWin, self).__init__(x, y, w, h)19 self.driver = driver20 self.update()21 self.showDetails = {}22 23 def handleEvent(self, event):24 if isinstance(event, lldb.SBEvent):25 if lldb.SBBreakpoint.EventIsBreakpointEvent(event):26 self.update()27 if isinstance(event, int):28 if event == ord("d"):29 self.deleteSelected()30 if event == curses.ascii.NL or event == curses.ascii.SP:31 self.toggleSelected()32 elif event == curses.ascii.TAB:33 if self.getSelected() != -1:34 target = self.driver.getTarget()35 if not target.IsValid():36 return37 i = target.GetBreakpointAtIndex(self.getSelected()).id38 self.showDetails[i] = not self.showDetails[i]39 self.update()40 super(BreakWin, self).handleEvent(event)41 42 def toggleSelected(self):43 if self.getSelected() == -1:44 return45 target = self.driver.getTarget()46 if not target.IsValid():47 return48 bp = target.GetBreakpointAtIndex(self.getSelected())49 bp.SetEnabled(not bp.IsEnabled())50 51 def deleteSelected(self):52 if self.getSelected() == -1:53 return54 target = self.driver.getTarget()55 if not target.IsValid():56 return57 bp = target.GetBreakpointAtIndex(self.getSelected())58 target.BreakpointDelete(bp.id)59 60 def update(self):61 target = self.driver.getTarget()62 if not target.IsValid():63 self.win.erase()64 self.win.noutrefresh()65 return66 selected = self.getSelected()67 self.clearItems()68 for i in range(0, target.GetNumBreakpoints()):69 bp = target.GetBreakpointAtIndex(i)70 if bp.IsInternal():71 continue72 text = lldbutil.get_description(bp)73 # FIXME: Use an API for this, not parsing the description.74 match = re.search("SBBreakpoint: id = ([^,]+), (.*)", text)75 try:76 id = match.group(1)77 desc = match.group(2).strip()78 if bp.IsEnabled():79 text = "%s: %s" % (id, desc)80 else:81 text = "%s: (disabled) %s" % (id, desc)82 except ValueError as e:83 # bp unparsable84 pass85 86 if self.showDetails.setdefault(bp.id, False):87 for location in bp:88 desc = lldbutil.get_description(89 location, lldb.eDescriptionLevelFull90 )91 text += "\n " + desc92 self.addItem(text)93 self.setSelected(selected)94