xref: /xnu-8019.80.24/tools/lldbmacros/core/lazytarget.py (revision a325d9c4a84054e40bbe985afedcb50ab80993ea)
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