1*a325d9c4SApple OSS Distributions 2*a325d9c4SApple OSS Distributions""" Module to abstract lazy evaluation of lldb.SBTarget 3*a325d9c4SApple OSS Distributions for kernel 4*a325d9c4SApple OSS Distributions""" 5*a325d9c4SApple OSS Distributions 6*a325d9c4SApple OSS Distributionsimport lldb 7*a325d9c4SApple OSS Distributions 8*a325d9c4SApple OSS Distributionsclass LazyTarget(object): 9*a325d9c4SApple OSS Distributions """ A common object that lazy-evaluates and caches the lldb.SBTarget 10*a325d9c4SApple OSS Distributions and lldb.SBProcess for the current interactive debugging session. 11*a325d9c4SApple OSS Distributions """ 12*a325d9c4SApple OSS Distributions _debugger = None # This holds an lldb.SBDebugger object for debugger state 13*a325d9c4SApple OSS Distributions _target = None # This holds an lldb.SBTarget object for symbol lookup 14*a325d9c4SApple OSS Distributions _process = None # This holds an lldb.SBProcess object for reading memory 15*a325d9c4SApple OSS Distributions 16*a325d9c4SApple OSS Distributions @staticmethod 17*a325d9c4SApple OSS Distributions def Initialize(debugger): 18*a325d9c4SApple OSS Distributions """ Initialize the LazyTarget with an SBDebugger. 19*a325d9c4SApple OSS Distributions """ 20*a325d9c4SApple OSS Distributions LazyTarget._debugger = debugger 21*a325d9c4SApple OSS Distributions LazyTarget._target = None 22*a325d9c4SApple OSS Distributions LazyTarget._process = None 23*a325d9c4SApple OSS Distributions 24*a325d9c4SApple OSS Distributions @staticmethod 25*a325d9c4SApple OSS Distributions def GetTarget(): 26*a325d9c4SApple OSS Distributions """ Get an SBTarget for the most recently selected 27*a325d9c4SApple OSS Distributions target, or throw an exception. 28*a325d9c4SApple OSS Distributions """ 29*a325d9c4SApple OSS Distributions if not LazyTarget._target is None: 30*a325d9c4SApple OSS Distributions return LazyTarget._target 31*a325d9c4SApple OSS Distributions 32*a325d9c4SApple OSS Distributions target = LazyTarget._debugger.GetSelectedTarget() 33*a325d9c4SApple OSS Distributions if target is None: 34*a325d9c4SApple OSS Distributions raise AttributeError('No target selected') 35*a325d9c4SApple OSS Distributions 36*a325d9c4SApple OSS Distributions if not target.IsValid(): 37*a325d9c4SApple OSS Distributions raise AttributeError('Target is not valid') 38*a325d9c4SApple OSS Distributions 39*a325d9c4SApple OSS Distributions LazyTarget._target = target 40*a325d9c4SApple OSS Distributions return target 41*a325d9c4SApple OSS Distributions 42*a325d9c4SApple OSS Distributions @staticmethod 43*a325d9c4SApple OSS Distributions def GetProcess(): 44*a325d9c4SApple OSS Distributions """ Get an SBProcess for the most recently selected 45*a325d9c4SApple OSS Distributions target, or throw an exception. 46*a325d9c4SApple OSS Distributions """ 47*a325d9c4SApple OSS Distributions 48*a325d9c4SApple OSS Distributions target = LazyTarget.GetTarget() 49*a325d9c4SApple OSS Distributions process = target.process 50*a325d9c4SApple OSS Distributions 51*a325d9c4SApple OSS Distributions if process is None: 52*a325d9c4SApple OSS Distributions raise AttributeError('Target does not have a process') 53*a325d9c4SApple OSS Distributions 54*a325d9c4SApple OSS Distributions if not process.IsValid(): 55*a325d9c4SApple OSS Distributions raise AttributeError('Process is not valid') 56*a325d9c4SApple OSS Distributions 57*a325d9c4SApple OSS Distributions return process 58