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