451 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			451 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- SWIG Interface for SBThread -----------------------------*- C++ -*-===//
 | ||
| //
 | ||
| //                     The LLVM Compiler Infrastructure
 | ||
| //
 | ||
| // This file is distributed under the University of Illinois Open Source
 | ||
| // License. See LICENSE.TXT for details.
 | ||
| //
 | ||
| //===----------------------------------------------------------------------===//
 | ||
| 
 | ||
| namespace lldb {
 | ||
| 
 | ||
| %feature("docstring",
 | ||
| "Represents a thread of execution. SBProcess contains SBThread(s).
 | ||
| 
 | ||
| SBThreads can be referred to by their ID, which maps to the system specific thread
 | ||
| identifier, or by IndexID.  The ID may or may not be unique depending on whether the
 | ||
| system reuses its thread identifiers.  The IndexID is a monotonically increasing identifier
 | ||
| that will always uniquely reference a particular thread, and when that thread goes
 | ||
| away it will not be reused.
 | ||
| 
 | ||
| SBThread supports frame iteration. For example (from test/python_api/
 | ||
| lldbutil/iter/TestLLDBIterator.py),
 | ||
| 
 | ||
|         from lldbutil import print_stacktrace
 | ||
|         stopped_due_to_breakpoint = False
 | ||
|         for thread in process:
 | ||
|             if self.TraceOn():
 | ||
|                 print_stacktrace(thread)
 | ||
|             ID = thread.GetThreadID()
 | ||
|             if thread.GetStopReason() == lldb.eStopReasonBreakpoint:
 | ||
|                 stopped_due_to_breakpoint = True
 | ||
|             for frame in thread:
 | ||
|                 self.assertTrue(frame.GetThread().GetThreadID() == ID)
 | ||
|                 if self.TraceOn():
 | ||
|                     print frame
 | ||
| 
 | ||
|         self.assertTrue(stopped_due_to_breakpoint)
 | ||
| 
 | ||
| See also SBProcess and SBFrame."
 | ||
| ) SBThread;
 | ||
| class SBThread
 | ||
| {
 | ||
| public:
 | ||
|     //------------------------------------------------------------------
 | ||
|     // Broadcaster bits.
 | ||
|     //------------------------------------------------------------------
 | ||
|     enum
 | ||
|     {
 | ||
|         eBroadcastBitStackChanged           = (1 << 0),
 | ||
|         eBroadcastBitThreadSuspended        = (1 << 1),
 | ||
|         eBroadcastBitThreadResumed          = (1 << 2),
 | ||
|         eBroadcastBitSelectedFrameChanged   = (1 << 3),
 | ||
|         eBroadcastBitThreadSelected         = (1 << 4)
 | ||
|     };
 | ||
| 
 | ||
| 
 | ||
|     SBThread ();
 | ||
| 
 | ||
|     SBThread (const lldb::SBThread &thread);
 | ||
| 
 | ||
|    ~SBThread();
 | ||
| 
 | ||
|     static const char *
 | ||
|     GetBroadcasterClassName ();
 | ||
|     
 | ||
|     static bool
 | ||
|     EventIsThreadEvent (const SBEvent &event);
 | ||
|     
 | ||
|     static SBFrame
 | ||
|     GetStackFrameFromEvent (const SBEvent &event);
 | ||
|     
 | ||
|     static SBThread
 | ||
|     GetThreadFromEvent (const SBEvent &event);
 | ||
| 
 | ||
|     bool
 | ||
|     IsValid() const;
 | ||
| 
 | ||
|     void
 | ||
|     Clear ();
 | ||
| 
 | ||
|     lldb::StopReason
 | ||
|     GetStopReason();
 | ||
| 
 | ||
|     %feature("docstring", "
 | ||
|     /// Get the number of words associated with the stop reason.
 | ||
|     /// See also GetStopReasonDataAtIndex().
 | ||
|     ") GetStopReasonDataCount;
 | ||
|     size_t
 | ||
|     GetStopReasonDataCount();
 | ||
| 
 | ||
|     %feature("docstring", "
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     /// Get information associated with a stop reason.
 | ||
|     ///
 | ||
|     /// Breakpoint stop reasons will have data that consists of pairs of 
 | ||
|     /// breakpoint IDs followed by the breakpoint location IDs (they always come
 | ||
|     /// in pairs).
 | ||
|     ///
 | ||
|     /// Stop Reason              Count Data Type
 | ||
|     /// ======================== ===== =========================================
 | ||
|     /// eStopReasonNone          0
 | ||
|     /// eStopReasonTrace         0
 | ||
|     /// eStopReasonBreakpoint    N     duple: {breakpoint id, location id}
 | ||
|     /// eStopReasonWatchpoint    1     watchpoint id
 | ||
|     /// eStopReasonSignal        1     unix signal number
 | ||
|     /// eStopReasonException     N     exception data
 | ||
|     /// eStopReasonExec          0
 | ||
|     /// eStopReasonPlanComplete  0
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     ") GetStopReasonDataAtIndex;
 | ||
|     uint64_t
 | ||
|     GetStopReasonDataAtIndex(uint32_t idx);
 | ||
|         
 | ||
|     %feature("autodoc", "
 | ||
|     Collects a thread's stop reason extended information dictionary and prints it
 | ||
|     into the SBStream in a JSON format. The format of this JSON dictionary depends
 | ||
|     on the stop reason and is currently used only for instrumentation plugins.
 | ||
|     ") GetStopReasonExtendedInfoAsJSON;
 | ||
|     bool
 | ||
|     GetStopReasonExtendedInfoAsJSON (lldb::SBStream &stream);
 | ||
|     
 | ||
|     %feature("autodoc", "
 | ||
|     Returns a collection of historical stack traces that are significant to the
 | ||
|     current stop reason. Used by ThreadSanitizer, where we provide various stack
 | ||
|     traces that were involved in a data race or other type of detected issue.
 | ||
|     ") GetStopReasonExtendedBacktraces;
 | ||
|     SBThreadCollection
 | ||
|     GetStopReasonExtendedBacktraces (InstrumentationRuntimeType type);
 | ||
| 
 | ||
| 
 | ||
|     %feature("autodoc", "
 | ||
|     Pass only an (int)length and expect to get a Python string describing the
 | ||
|     stop reason.
 | ||
|     ") GetStopDescription;
 | ||
|     size_t
 | ||
|     GetStopDescription (char *dst, size_t dst_len);
 | ||
| 
 | ||
|     SBValue
 | ||
|     GetStopReturnValue ();
 | ||
| 
 | ||
|     %feature("autodoc", "
 | ||
|     Returns a unique thread identifier (type lldb::tid_t, typically a 64-bit type)
 | ||
|     for the current SBThread that will remain constant throughout the thread's
 | ||
|     lifetime in this process and will not be reused by another thread during this
 | ||
|     process lifetime.  On Mac OS X systems, this is a system-wide unique thread
 | ||
|     identifier; this identifier is also used by other tools like sample which helps
 | ||
|     to associate data from those tools with lldb.  See related GetIndexID.
 | ||
|     ")
 | ||
|     GetThreadID;
 | ||
|     lldb::tid_t
 | ||
|     GetThreadID () const;
 | ||
| 
 | ||
|     %feature("autodoc", "
 | ||
|     Return the index number for this SBThread.  The index number is the same thing
 | ||
|     that a user gives as an argument to 'thread select' in the command line lldb.
 | ||
|     These numbers start at 1 (for the first thread lldb sees in a debug session)
 | ||
|     and increments up throughout the process lifetime.  An index number will not be
 | ||
|     reused for a different thread later in a process - thread 1 will always be
 | ||
|     associated with the same thread.  See related GetThreadID.
 | ||
|     This method returns a uint32_t index number, takes no arguments.
 | ||
|     ")
 | ||
|     GetIndexID;
 | ||
|     uint32_t
 | ||
|     GetIndexID () const;
 | ||
| 
 | ||
|     const char *
 | ||
|     GetName () const;
 | ||
| 
 | ||
|     %feature("autodoc", "
 | ||
|     Return the queue name associated with this thread, if any, as a str.
 | ||
|     For example, with a libdispatch (aka Grand Central Dispatch) queue.
 | ||
|     ") GetQueueName;
 | ||
| 
 | ||
|     const char *
 | ||
|     GetQueueName() const;
 | ||
| 
 | ||
|     %feature("autodoc", "
 | ||
|     Return the dispatch_queue_id for this thread, if any, as a lldb::queue_id_t.
 | ||
|     For example, with a libdispatch (aka Grand Central Dispatch) queue.
 | ||
|     ") GetQueueID;
 | ||
| 
 | ||
|     lldb::queue_id_t
 | ||
|     GetQueueID() const;
 | ||
| 
 | ||
|     %feature("docstring", "
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     /// Takes a path string and a SBStream reference as parameters, returns a bool.  
 | ||
|     /// Collects the thread's 'info' dictionary from the remote system, uses the path
 | ||
|     /// argument to descend into the dictionary to an item of interest, and prints
 | ||
|     /// it into the SBStream in a natural format.  Return bool is to indicate if
 | ||
|     /// anything was printed into the stream (true) or not (false).
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     ") GetInfoItemByPathAsString;
 | ||
| 
 | ||
|     bool
 | ||
|     GetInfoItemByPathAsString (const char *path, lldb::SBStream &strm);
 | ||
| 
 | ||
|     %feature("autodoc", "
 | ||
|     Return the SBQueue for this thread.  If this thread is not currently associated
 | ||
|     with a libdispatch queue, the SBQueue object's IsValid() method will return false.
 | ||
|     If this SBThread is actually a HistoryThread, we may be able to provide QueueID
 | ||
|     and QueueName, but not provide an SBQueue.  Those individual attributes may have
 | ||
|     been saved for the HistoryThread without enough information to reconstitute the
 | ||
|     entire SBQueue at that time.
 | ||
|     This method takes no arguments, returns an SBQueue.
 | ||
|     ") GetQueue;
 | ||
| 
 | ||
|     lldb::SBQueue
 | ||
|     GetQueue () const;
 | ||
| 
 | ||
|     void
 | ||
|     StepOver (lldb::RunMode stop_other_threads = lldb::eOnlyDuringStepping);
 | ||
| 
 | ||
|     void
 | ||
|     StepInto (lldb::RunMode stop_other_threads = lldb::eOnlyDuringStepping);
 | ||
| 
 | ||
|     void
 | ||
|     StepInto (const char *target_name, lldb::RunMode stop_other_threads = lldb::eOnlyDuringStepping);
 | ||
| 
 | ||
|     %feature("autodoc", "
 | ||
|     Step  the current thread from the current source line to the line given by end_line, stopping if
 | ||
|     the thread steps into the function given by target_name.  If target_name is None, then stepping will stop
 | ||
|     in any of the places we would normally stop.
 | ||
|     ") StepInto;
 | ||
|     void
 | ||
|     StepInto (const char *target_name,
 | ||
|               uint32_t end_line,
 | ||
|               SBError &error,
 | ||
|               lldb::RunMode stop_other_threads = lldb::eOnlyDuringStepping);
 | ||
| 
 | ||
|     void
 | ||
|     StepOut ();
 | ||
| 
 | ||
|     void
 | ||
|     StepOutOfFrame (lldb::SBFrame &frame);
 | ||
| 
 | ||
|     void
 | ||
|     StepInstruction(bool step_over);
 | ||
| 
 | ||
|     SBError
 | ||
|     StepOverUntil (lldb::SBFrame &frame,
 | ||
|                    lldb::SBFileSpec &file_spec,
 | ||
|                    uint32_t line);
 | ||
| 
 | ||
|     SBError
 | ||
|     StepUsingScriptedThreadPlan (const char *script_class_name);
 | ||
| 
 | ||
|     SBError
 | ||
|     StepUsingScriptedThreadPlan (const char *script_class_name, bool resume_immediately);
 | ||
| 
 | ||
|     SBError
 | ||
|     JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line);
 | ||
| 
 | ||
|     void
 | ||
|     RunToAddress (lldb::addr_t addr);
 | ||
| 
 | ||
|     %feature("autodoc", "
 | ||
|     Force a return from the frame passed in (and any frames younger than it)
 | ||
|     without executing any more code in those frames.  If return_value contains
 | ||
|     a valid SBValue, that will be set as the return value from frame.  Note, at
 | ||
|     present only scalar return values are supported.
 | ||
|     ") ReturnFromFrame;
 | ||
|     
 | ||
|     SBError
 | ||
|     ReturnFromFrame (SBFrame &frame, SBValue &return_value);
 | ||
| 
 | ||
|     %feature("autodoc", "
 | ||
|     Unwind the stack frames from the innermost expression evaluation.
 | ||
|     This API is equivalent to 'thread return -x'.
 | ||
|     ") UnwindInnermostExpression;
 | ||
|     
 | ||
|     SBError
 | ||
|     UnwindInnermostExpression();
 | ||
| 
 | ||
|     %feature("docstring", "
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     /// LLDB currently supports process centric debugging which means when any
 | ||
|     /// thread in a process stops, all other threads are stopped. The Suspend()
 | ||
|     /// call here tells our process to suspend a thread and not let it run when
 | ||
|     /// the other threads in a process are allowed to run. So when 
 | ||
|     /// SBProcess::Continue() is called, any threads that aren't suspended will
 | ||
|     /// be allowed to run. If any of the SBThread functions for stepping are 
 | ||
|     /// called (StepOver, StepInto, StepOut, StepInstruction, RunToAddres), the
 | ||
|     /// thread will now be allowed to run and these functions will simply return.
 | ||
|     ///
 | ||
|     /// Eventually we plan to add support for thread centric debugging where
 | ||
|     /// each thread is controlled individually and each thread would broadcast
 | ||
|     /// its state, but we haven't implemented this yet.
 | ||
|     /// 
 | ||
|     /// Likewise the SBThread::Resume() call will again allow the thread to run
 | ||
|     /// when the process is continued.
 | ||
|     ///
 | ||
|     /// Suspend() and Resume() functions are not currently reference counted, if
 | ||
|     /// anyone has the need for them to be reference counted, please let us
 | ||
|     /// know.
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     ") Suspend;
 | ||
|     bool
 | ||
|     Suspend();
 | ||
|     
 | ||
|     bool
 | ||
|     Resume ();
 | ||
|     
 | ||
|     bool
 | ||
|     IsSuspended();
 | ||
| 
 | ||
|     bool
 | ||
|     IsStopped();
 | ||
| 
 | ||
|     uint32_t
 | ||
|     GetNumFrames ();
 | ||
| 
 | ||
|     lldb::SBFrame
 | ||
|     GetFrameAtIndex (uint32_t idx);
 | ||
| 
 | ||
|     lldb::SBFrame
 | ||
|     GetSelectedFrame ();
 | ||
| 
 | ||
|     lldb::SBFrame
 | ||
|     SetSelectedFrame (uint32_t frame_idx);
 | ||
| 
 | ||
|     lldb::SBProcess
 | ||
|     GetProcess ();
 | ||
| 
 | ||
|     bool
 | ||
|     GetDescription (lldb::SBStream &description) const;
 | ||
|     
 | ||
|     %feature("docstring", "
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     /// Get the description strings for this thread that match what the 
 | ||
|     /// lldb driver will present, using the thread-format (stop_format==false)
 | ||
|     /// or thread-stop-format (stop_format = true). 
 | ||
|     //--------------------------------------------------------------------------
 | ||
|     ") GetDescription;
 | ||
|     bool GetDescription(lldb::SBStream &description, bool stop_format) const;
 | ||
| 
 | ||
|     bool
 | ||
|     GetStatus (lldb::SBStream &status) const;
 | ||
|     
 | ||
|     bool
 | ||
|     operator == (const lldb::SBThread &rhs) const;
 | ||
| 
 | ||
|     bool
 | ||
|     operator != (const lldb::SBThread &rhs) const;
 | ||
| 
 | ||
|     %feature("autodoc","
 | ||
|     Given an argument of str to specify the type of thread-origin extended
 | ||
|     backtrace to retrieve, query whether the origin of this thread is 
 | ||
|     available.  An SBThread is retured; SBThread.IsValid will return true
 | ||
|     if an extended backtrace was available.  The returned SBThread is not
 | ||
|     a part of the SBProcess' thread list and it cannot be manipulated like
 | ||
|     normal threads -- you cannot step or resume it, for instance -- it is
 | ||
|     intended to used primarily for generating a backtrace.  You may request
 | ||
|     the returned thread's own thread origin in turn.
 | ||
|     ") GetExtendedBacktraceThread;
 | ||
|     lldb::SBThread
 | ||
|     GetExtendedBacktraceThread (const char *type);
 | ||
| 
 | ||
|     %feature("autodoc","
 | ||
|     Takes no arguments, returns a uint32_t.
 | ||
|     If this SBThread is an ExtendedBacktrace thread, get the IndexID of the
 | ||
|     original thread that this ExtendedBacktrace thread represents, if 
 | ||
|     available.  The thread that was running this backtrace in the past may
 | ||
|     not have been registered with lldb's thread index (if it was created,
 | ||
|     did its work, and was destroyed without lldb ever stopping execution).
 | ||
|     In that case, this ExtendedBacktrace thread's IndexID will be returned.
 | ||
|     ") GetExtendedBacktraceOriginatingIndexID;
 | ||
|     uint32_t
 | ||
|     GetExtendedBacktraceOriginatingIndexID();
 | ||
| 
 | ||
|     %feature("autodoc","
 | ||
|     Takes no arguments, returns a bool.
 | ||
|     lldb may be able to detect that function calls should not be executed
 | ||
|     on a given thread at a particular point in time.  It is recommended that
 | ||
|     this is checked before performing an inferior function call on a given
 | ||
|     thread.
 | ||
|     ") SafeToCallFunctions;
 | ||
|     bool
 | ||
|     SafeToCallFunctions ();
 | ||
| 
 | ||
|     %pythoncode %{
 | ||
|         class frames_access(object):
 | ||
|             '''A helper object that will lazily hand out frames for a thread when supplied an index.'''
 | ||
|             def __init__(self, sbthread):
 | ||
|                 self.sbthread = sbthread
 | ||
| 
 | ||
|             def __len__(self):
 | ||
|                 if self.sbthread:
 | ||
|                     return int(self.sbthread.GetNumFrames())
 | ||
|                 return 0
 | ||
|             
 | ||
|             def __getitem__(self, key):
 | ||
|                 if type(key) is int and key < self.sbthread.GetNumFrames():
 | ||
|                     return self.sbthread.GetFrameAtIndex(key)
 | ||
|                 return None
 | ||
|         
 | ||
|         def get_frames_access_object(self):
 | ||
|             '''An accessor function that returns a frames_access() object which allows lazy frame access from a lldb.SBThread object.'''
 | ||
|             return self.frames_access (self)
 | ||
| 
 | ||
|         def get_thread_frames(self):
 | ||
|             '''An accessor function that returns a list() that contains all frames in a lldb.SBThread object.'''
 | ||
|             frames = []
 | ||
|             for frame in self:
 | ||
|                 frames.append(frame)
 | ||
|             return frames
 | ||
|         
 | ||
|         __swig_getmethods__["id"] = GetThreadID
 | ||
|         if _newclass: id = property(GetThreadID, None, doc='''A read only property that returns the thread ID as an integer.''')
 | ||
| 
 | ||
|         __swig_getmethods__["idx"] = GetIndexID
 | ||
|         if _newclass: idx = property(GetIndexID, None, doc='''A read only property that returns the thread index ID as an integer. Thread index ID values start at 1 and increment as threads come and go and can be used to uniquely identify threads.''')
 | ||
| 
 | ||
|         __swig_getmethods__["return_value"] = GetStopReturnValue
 | ||
|         if _newclass: return_value = property(GetStopReturnValue, None, doc='''A read only property that returns an lldb object that represents the return value from the last stop (lldb.SBValue) if we just stopped due to stepping out of a function.''')
 | ||
| 
 | ||
|         __swig_getmethods__["process"] = GetProcess
 | ||
|         if _newclass: process = property(GetProcess, None, doc='''A read only property that returns an lldb object that represents the process (lldb.SBProcess) that owns this thread.''')
 | ||
| 
 | ||
|         __swig_getmethods__["num_frames"] = GetNumFrames
 | ||
|         if _newclass: num_frames = property(GetNumFrames, None, doc='''A read only property that returns the number of stack frames in this thread as an integer.''')
 | ||
| 
 | ||
|         __swig_getmethods__["frames"] = get_thread_frames
 | ||
|         if _newclass: frames = property(get_thread_frames, None, doc='''A read only property that returns a list() of lldb.SBFrame objects for all frames in this thread.''')
 | ||
| 
 | ||
|         __swig_getmethods__["frame"] = get_frames_access_object
 | ||
|         if _newclass: frame = property(get_frames_access_object, None, doc='''A read only property that returns an object that can be used to access frames as an array ("frame_12 = lldb.thread.frame[12]").''')
 | ||
| 
 | ||
|         __swig_getmethods__["name"] = GetName
 | ||
|         if _newclass: name = property(GetName, None, doc='''A read only property that returns the name of this thread as a string.''')
 | ||
| 
 | ||
|         __swig_getmethods__["queue"] = GetQueueName
 | ||
|         if _newclass: queue = property(GetQueueName, None, doc='''A read only property that returns the dispatch queue name of this thread as a string.''')
 | ||
| 
 | ||
|         __swig_getmethods__["queue_id"] = GetQueueID
 | ||
|         if _newclass: queue_id = property(GetQueueID, None, doc='''A read only property that returns the dispatch queue id of this thread as an integer.''')
 | ||
| 
 | ||
|         __swig_getmethods__["stop_reason"] = GetStopReason
 | ||
|         if _newclass: stop_reason = property(GetStopReason, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eStopReason") that represents the reason this thread stopped.''')
 | ||
| 
 | ||
|         __swig_getmethods__["is_suspended"] = IsSuspended
 | ||
|         if _newclass: is_suspended = property(IsSuspended, None, doc='''A read only property that returns a boolean value that indicates if this thread is suspended.''')
 | ||
| 
 | ||
|         __swig_getmethods__["is_stopped"] = IsStopped
 | ||
|         if _newclass: is_stopped = property(IsStopped, None, doc='''A read only property that returns a boolean value that indicates if this thread is stopped but not exited.''')
 | ||
|     %}
 | ||
| 
 | ||
| };
 | ||
| 
 | ||
| } // namespace lldb
 |