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