breakpoint - restructured breakpoint into bpdb

This commit is contained in:
Ken Patel 2010-04-19 19:11:34 +00:00
parent a464e45c0e
commit 8ca8e8bfc2

View File

@ -33,8 +33,7 @@ __all__ = ['enumerate', 'unique', 'indent', 'nonRepeatingRandomList',
'pandaBreak','pandaTrace','formatTimeCompact','DestructiveScratchPad',
'deeptype','getProfileResultString','StdoutCapture','StdoutPassthrough',
'Averager', 'getRepository', 'formatTimeExact', 'startSuperLog', 'endSuperLog',
'typeName', 'safeTypeName', 'histogramDict', 'unescapeHtmlString',
'bp', 'bpGroup', 'bpDecorator', ]
'typeName', 'safeTypeName', 'histogramDict', 'unescapeHtmlString', 'bpdb', ]
import types
import string
@ -4310,8 +4309,12 @@ if __debug__:
assert repeatableRepr({1: 'a', 2: 'b'}) == repeatableRepr({2: 'b', 1: 'a'})
assert repeatableRepr(set([1,2,3])) == repeatableRepr(set([3,2,1]))
#breakpoint system - kanpatel
class bpDebugger:
#bpdb - breakpoint debugging system
#kanpatel
bpEnabled = True
class BpDb:
lastBp = None
def set_trace(self, frameCount=1):
#find usefule frame
self.currFrame = sys._getframe()
@ -4322,19 +4325,19 @@ class bpDebugger:
#set up and start debuggger
self.pdb = pdb.Pdb()
self.pdb.do_alias('aa breakpoint.debugger.addAliases()')
self.pdb.do_alias('aa bpdb.addAliases()')
self.addAliases()
self.pdb.set_trace(interactFrame);
def addAliases(self):
self.aliases = {}
#bpDebugger cmds
self.makeAlias('_i', 'breakpoint.lastBp.ignore(%*)')
self.makeAlias('_t', 'breakpoint.lastBp.toggle(%*)')
self.makeAlias('_tg', 'breakpoint.lastBp.toggleGroup(%*)')
self.makeAlias('_z', 'breakpoint.lastBp.reset(%*)')
self.makeAlias('_h', 'breakpoint.bpdb.displayHelp()')
self.makeAlias('_ua', 'breakpoint.bpdb.removeAliases()')
#bpdb cmds
self.makeAlias('_i', 'bpdb.lastBp.ignore(%*)')
self.makeAlias('_t', 'bpdb.lastBp.toggle(%*)')
self.makeAlias('_tg', 'bpdb.lastBp.toggleGroup(%*)')
self.makeAlias('_z', 'bpdb.lastBp.reset(%*)')
self.makeAlias('_h', 'bpdb.displayHelp()')
self.makeAlias('_ua', 'bpdb.removeAliases()')
def makeAlias(self, name, cmd):
self.aliases[name] = cmd
@ -4344,157 +4347,26 @@ class bpDebugger:
for name in self.aliases.iterkeys():
self.pdb.do_unalias(name)
self.aliases = {}
print '(bpDebugger aliases removed)'
print '(bpdb aliases removed)'
def displayHelp(self):
print 'You may use normal pdb commands plus the following:'
print ' _i n set ignore count for this breakpoint to n'
print ' _t toggle this breakpoint'
print ' _tg toggle this breakpoint group'
print ' _z clear all settings for this breakpoint (name)'
#print ' cmd [param <def>] [cmd] does )this( with [param] (default is def)'
#print ' -----------------------------------------------------------------------'
print ' _i [n <0>, name=<curr>] set ignore count for breakpoint [name] to [n]'
print ' _t [name <curr>] toggle breakpoint name [name]'
print ' _tg [grp <curr>] toggle breakpoint group [grp]'
print ' _z [name <curr>] clear all settings for breakpoint [name]'
print ' _h displays this usage help'
print ' _ua unalias these commands from pdb'
bpEnabled = True
class bp:
bpdb = bpDebugger()
grpInfos = {}
nameInfos = {}
lastBp = None
def __init__(self, name=None, grp=None, cfg=None, iff=True):
#check early out conditions
if not bpEnabled:
return
#store this breakpoint's settings
self.name = name
bp.nameInfos.setdefault(name, {})
self.grp = grp
bp.grpInfos.setdefault(grp, {})
self.cfg = cfg
self.iff = iff
#cache this as the latest bp
bp.lastBp = self
@staticmethod
def bp(name=None, grp=None, cfg=None, iff=True, frameCount=1):
bpi = bp(name=name, grp=grp, cfg=cfg, iff=iff)
bpi.maybeBreak(frameCount=frameCount+1)
@staticmethod
def prettyName(name=None, grp=None, cfg=None, q=0):
prettyName = ''
prettyName += choice(q, "'", '')
prettyName += choice(cfg, '%s::'%(cfg,), '')
prettyName += choice(grp, '%s.'%(grp,), '')
prettyName += choice(name, '%s'%(name,), '')
prettyName += choice(q, "'", '')
return prettyName
def displayContextHint(self):
contextString = self.prettyName(name=self.name,grp=self.grp,cfg=self.cfg)
dashes = '-'*max(0, (80 - len(contextString) - 4) / 2)
print '<%s %s %s>'%(dashes,contextString,dashes)
def enable(self, enabled=True, name=None):
name = name or self.name
self.nameInfos.setdefault(name, {})
self.nameInfos[name]['enabled'] = enabled
def toggle(self, name=None):
name = name or self.name
self.nameInfos.setdefault(name, {})
newEnabled = not self.nameInfos[name].get('enabled', True)
self.nameInfos[name]['enabled'] = newEnabled
print '%s is now %s.'%(self.prettyName(name,q=1),choice(newEnabled,'enabled','disabled'),)
def toggleGroup(self, grp=None):
grp = grp or self.grp
self.grpInfos.setdefault(grp, {})
newEnabled = not self.grpInfos[grp].get('enabled', True)
self.grpInfos[grp]['enabled'] = newEnabled
print '%s is now %s.'%(self.prettyName(grp,q=1),choice(newEnabled,'enabled','disabled'),)
def ignore(self, ignoreCount=0, name=None):
name = name or self.name
self.nameInfos.setdefault(name, {})
self.nameInfos[name]['ignoreCount'] = ignoreCount
print '%s will ignored %s times.'%(self.prettyName(name,q=1),ignoreCount,)
def reset(self, name=None):
name = name or self.name
self.nameInfos[name] = {}
print '%s has been reset.'%(self.prettyName(name,q=1),)
def maybeBreak(self, iff=True, frameCount=1):
if self.shouldBreak(iff):
self.doBreak(frameCount=frameCount+1)
def shouldBreak(self,iff=True):
#check easy early out
if not self.iff or not iff:
return False
#check disabled conditions
if not bp.grpInfos[self.grp].get('enabled', True):
return False
if not bp.nameInfos[self.name].get('enabled', True):
return False
if self.cfg:
dConfigParamList = []
dConfigParams = choice(isinstance(self.cfg, (list,tuple)), self.cfg, (self.cfg,))
dConfigParamList = [param for param in dConfigParams \
if ConfigVariableBool('want-breakpoint-%s' % (param,), 0).getValue()]
if not dConfigParamList:
return False
#check skip conditions
if bp.nameInfos[self.name].get('ignore', 0) > 0:
bp.nameInfos[self.name]['ignoreCount'] -= 1
return False
if bp.nameInfos[self.name].get('lifetime', -1) == 0:
return False
#all conditions go
return True
def doBreak(self, frameCount=1):
#accumulate hit count
if 'lifetime' in bp.nameInfos[self.name]:
bp.nameInfos[self.name]['lifetime'] -= 1
bp.nameInfos[self.name]['count'] = bp.nameInfos[self.name].get('count', 0) + 1
#setup debugger
self.displayContextHint()
self.bpdb.set_trace(frameCount=frameCount+1)
class bpStub:
def __init__(self,name,grp=None,cfg=None,iff=True):
pass
def prettyName(self, name=None, grp=None, cfg=None, q=0):
return '(bp Disabled)'
def displayContextHint(self):
pass
def enable(self, enabled=True, name=None):
pass
def toggle(self, name=None):
pass
def toggleGroup(self, grp=None):
pass
def ignore(self, ignoreCount=0, name=None):
pass
def reset(self, name=None):
pass
def maybeBreak(self, iff=True, frameCount=1):
pass
def shouldBreak(self,iff=True):
return False
def doBreak(self, frameCount=1):
pass
if not bpEnabled:
bp = bpStub
def bpDecorator(name=None,grp=None,cfg=None,iff=True,frameCount=1):
def bpCall(name=None,grp=None,cfg=None,iff=True,frameCount=1,onEnter=1,onExit=0):
def decorator(f):
return f
@ -4558,8 +4430,11 @@ def bpDecorator(name=None,grp=None,cfg=None,iff=True,frameCount=1):
dgrp = grp
dcfg = cfg
dbp = bp(name=dname,grp=dgrp,cfg=dcfg)
dbp.maybeBreak(iff=iff,frameCount=frameCount+1)
if onEnter:
dbp.maybeBreak(iff=iff,frameCount=frameCount+1,displayPrefix='Entering ')
f_result = f(*args, **kwds)
if onExit:
dbp.maybeBreak(iff=iff,frameCount=frameCount+1,displayPrefix='Exited ')
return f_result
wrap.func_name = f.func_name
@ -4570,14 +4445,140 @@ def bpDecorator(name=None,grp=None,cfg=None,iff=True,frameCount=1):
return decorator
def bpGroup(*args, **kArgs):
@staticmethod
def group(*args, **kArgs):
argsCopy = args[:]
def functor(*cArgs, **ckArgs):
kArgs.update(ckArgs)
return bp(*(cArgs), **kArgs).maybeBreak(frameCount=kArgs.get('frameCount',1)+1)
ckArgs.update(kArgs)
ckArgs['frameCount'] = ckArgs.get('frameCount',1)+1
return bpdb.bp(*(cArgs), **ckArgs)
return functor
if not bpEnabled:
@staticmethod
def brk(*args, **kArgs):
return
@staticmethod
def brkDec(*args, **kArgs):
def decorator(f):
return f
return decorator
@staticmethod
def group(*args, **kArgs):
def functor(*cArgs, **ckArgs):
return
return functor
class bp:
grpInfos = {}
nameInfos = {}
def __init__(self, name=None, grp=None, cfg=None, iff=True):
#check early out conditions
if not bpEnabled:
return
#store this breakpoint's settings
self.name = name
bp.nameInfos.setdefault(name, {})
self.grp = grp
bp.grpInfos.setdefault(grp, {})
self.cfg = cfg
self.iff = iff
#cache this as the latest bp
bpdb.lastBp = self
@staticmethod
def prettyName(name=None, grp=None, cfg=None, q=0):
prettyName = ''
prettyName += choice(q, "'", '')
prettyName += choice(cfg, '%s::'%(cfg,), '')
prettyName += choice(grp, '%s.'%(grp,), '')
prettyName += choice(name, '%s'%(name,), '')
prettyName += choice(q, "'", '')
return prettyName
def displayContextHint(self, displayPrefix=''):
contextString = displayPrefix + self.prettyName(name=self.name,grp=self.grp,cfg=self.cfg)
dashes = '-'*max(0, (80 - len(contextString) - 4) / 2)
print '<%s %s %s>'%(dashes,contextString,dashes)
def enable(self, enabled=True, name=None):
name = name or self.name
self.nameInfos.setdefault(name, {})
self.nameInfos[name]['enabled'] = enabled
def toggle(self, name=None):
name = name or self.name
self.nameInfos.setdefault(name, {})
newEnabled = not self.nameInfos[name].get('enabled', True)
self.nameInfos[name]['enabled'] = newEnabled
print '%s is now %s.'%(self.prettyName(name,q=1),choice(newEnabled,'enabled','disabled'),)
def toggleGroup(self, grp=None):
grp = grp or self.grp
self.grpInfos.setdefault(grp, {})
newEnabled = not self.grpInfos[grp].get('enabled', True)
self.grpInfos[grp]['enabled'] = newEnabled
print '%s is now %s.'%(self.prettyName(grp,q=1),choice(newEnabled,'enabled','disabled'),)
def ignore(self, ignoreCount=0, name=None):
name = name or self.name
self.nameInfos.setdefault(name, {})
self.nameInfos[name]['ignoreCount'] = ignoreCount
print '%s will ignored %s times.'%(self.prettyName(name,q=1),ignoreCount,)
def reset(self, name=None):
name = name or self.name
self.nameInfos[name] = {}
print '%s has been reset.'%(self.prettyName(name,q=1),)
def maybeBreak(self, iff=True, frameCount=1,displayPrefix=''):
if self.shouldBreak(iff):
self.doBreak(frameCount=frameCount+1,displayPrefix=displayPrefix)
def shouldBreak(self,iff=True):
#check easy early out
if not self.iff or not iff:
return False
#check disabled conditions
if not bp.grpInfos[self.grp].get('enabled', True):
return False
if not bp.nameInfos[self.name].get('enabled', True):
return False
if self.cfg:
dConfigParamList = []
dConfigParams = choice(isinstance(self.cfg, (list,tuple)), self.cfg, (self.cfg,))
dConfigParamList = [param for param in dConfigParams \
if ConfigVariableBool('want-breakpoint-%s' % (param,), 0).getValue()]
if not dConfigParamList:
return False
#check skip conditions
if bp.nameInfos[self.name].get('ignore', 0) > 0:
bp.nameInfos[self.name]['ignoreCount'] -= 1
return False
if bp.nameInfos[self.name].get('lifetime', -1) == 0:
return False
#all conditions go
return True
def doBreak(self, frameCount=1,displayPrefix=''):
#accumulate hit count
if 'lifetime' in bp.nameInfos[self.name]:
bp.nameInfos[self.name]['lifetime'] -= 1
bp.nameInfos[self.name]['count'] = bp.nameInfos[self.name].get('count', 0) + 1
#setup debugger
self.displayContextHint(displayPrefix=displayPrefix)
bpdb.set_trace(frameCount=frameCount+1)
bpdb = BpDb()
import __builtin__
__builtin__.Functor = Functor
@ -4639,6 +4640,4 @@ __builtin__.typeName = typeName
__builtin__.safeTypeName = safeTypeName
__builtin__.histogramDict = histogramDict
__builtin__.repeatableRepr = repeatableRepr
__builtin__.breakpoint = choice(bpEnabled, bp, bpStub)
__builtin__.breakpointGroup = bpGroup
__builtin__.breakpointDecorator = bpDecorator
__builtin__.bpdb = bpdb