aboutsummaryrefslogtreecommitdiff
path: root/lldb/include/lldb/Target/SystemRuntime.h
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/include/lldb/Target/SystemRuntime.h')
-rw-r--r--lldb/include/lldb/Target/SystemRuntime.h593
1 files changed, 288 insertions, 305 deletions
diff --git a/lldb/include/lldb/Target/SystemRuntime.h b/lldb/include/lldb/Target/SystemRuntime.h
index cefd7240..3a2a544 100644
--- a/lldb/include/lldb/Target/SystemRuntime.h
+++ b/lldb/include/lldb/Target/SystemRuntime.h
@@ -16,14 +16,14 @@
// Project includes
#include <vector>
-#include "lldb/lldb-public.h"
#include "lldb/Core/ConstString.h"
#include "lldb/Core/ModuleList.h"
#include "lldb/Core/PluginInterface.h"
#include "lldb/Core/StructuredData.h"
-#include "lldb/Target/QueueList.h"
#include "lldb/Target/QueueItem.h"
+#include "lldb/Target/QueueList.h"
#include "lldb/lldb-private.h"
+#include "lldb/lldb-public.h"
namespace lldb_private {
@@ -38,7 +38,7 @@ namespace lldb_private {
/// For instance, a system runtime plugin use a breakpoint when threads
/// are created to record the backtrace of where that thread was created.
/// Later, when backtracing the created thread, it could extend the backtrace
-/// to show where it was originally created from.
+/// to show where it was originally created from.
///
/// The plugin will insert its own breakpoint when Created and start collecting
/// information. Later when it comes time to augment a Thread, it can be
@@ -46,332 +46,315 @@ namespace lldb_private {
///
//----------------------------------------------------------------------
-class SystemRuntime :
- public PluginInterface
-{
+class SystemRuntime : public PluginInterface {
public:
- //------------------------------------------------------------------
- /// Find a system runtime plugin for a given process.
- ///
- /// Scans the installed SystemRuntime plugins and tries to find
- /// an instance that can be used to track image changes in \a
- /// process.
- ///
- /// @param[in] process
- /// The process for which to try and locate a system runtime
- /// plugin instance.
- //------------------------------------------------------------------
- static SystemRuntime*
- FindPlugin (Process *process);
-
- //------------------------------------------------------------------
- /// Construct with a process.
- // -----------------------------------------------------------------
- SystemRuntime(lldb_private::Process *process);
+ //------------------------------------------------------------------
+ /// Find a system runtime plugin for a given process.
+ ///
+ /// Scans the installed SystemRuntime plugins and tries to find
+ /// an instance that can be used to track image changes in \a
+ /// process.
+ ///
+ /// @param[in] process
+ /// The process for which to try and locate a system runtime
+ /// plugin instance.
+ //------------------------------------------------------------------
+ static SystemRuntime *FindPlugin(Process *process);
- //------------------------------------------------------------------
- /// Destructor.
- ///
- /// The destructor is virtual since this class is designed to be
- /// inherited by the plug-in instance.
- //------------------------------------------------------------------
- ~SystemRuntime() override;
+ //------------------------------------------------------------------
+ /// Construct with a process.
+ // -----------------------------------------------------------------
+ SystemRuntime(lldb_private::Process *process);
- //------------------------------------------------------------------
- /// Called after attaching to a process.
- ///
- /// Allow the SystemRuntime plugin to execute some code after attaching
- /// to a process.
- //------------------------------------------------------------------
- virtual void
- DidAttach ();
+ //------------------------------------------------------------------
+ /// Destructor.
+ ///
+ /// The destructor is virtual since this class is designed to be
+ /// inherited by the plug-in instance.
+ //------------------------------------------------------------------
+ ~SystemRuntime() override;
- //------------------------------------------------------------------
- /// Called after launching a process.
- ///
- /// Allow the SystemRuntime plugin to execute some code after launching
- /// a process.
- //------------------------------------------------------------------
- virtual void
- DidLaunch();
+ //------------------------------------------------------------------
+ /// Called after attaching to a process.
+ ///
+ /// Allow the SystemRuntime plugin to execute some code after attaching
+ /// to a process.
+ //------------------------------------------------------------------
+ virtual void DidAttach();
- //------------------------------------------------------------------
- /// Called when modules have been loaded in the process.
- ///
- /// Allow the SystemRuntime plugin to enable logging features in the
- /// system runtime libraries.
- //------------------------------------------------------------------
- virtual void
- ModulesDidLoad(lldb_private::ModuleList &module_list);
+ //------------------------------------------------------------------
+ /// Called after launching a process.
+ ///
+ /// Allow the SystemRuntime plugin to execute some code after launching
+ /// a process.
+ //------------------------------------------------------------------
+ virtual void DidLaunch();
- //------------------------------------------------------------------
- /// Called before detaching from a process.
- ///
- /// This will give a SystemRuntime plugin a chance to free any resources
- /// in the inferior process before we detach.
- //------------------------------------------------------------------
- virtual void
- Detach ();
+ //------------------------------------------------------------------
+ /// Called when modules have been loaded in the process.
+ ///
+ /// Allow the SystemRuntime plugin to enable logging features in the
+ /// system runtime libraries.
+ //------------------------------------------------------------------
+ virtual void ModulesDidLoad(lldb_private::ModuleList &module_list);
- //------------------------------------------------------------------
- /// Return a list of thread origin extended backtraces that may
- /// be available.
- ///
- /// A System Runtime may be able to provide a backtrace of when this
- /// thread was originally created. Furthermore, it may be able to
- /// provide that extended backtrace for different styles of creation.
- /// On a system with both pthreads and libdispatch, aka Grand Central
- /// Dispatch, queues, the system runtime may be able to provide the
- /// pthread creation of the thread and it may also be able to provide
- /// the backtrace of when this GCD queue work block was enqueued.
- /// The caller may request these different origins by name.
- ///
- /// The names will be provided in the order that they are most likely
- /// to be requested. For instance, a most natural order may be to
- /// request the GCD libdispatch queue origin. If there is none, then
- /// request the pthread origin.
- ///
- /// @return
- /// A vector of ConstStrings with names like "pthread" or "libdispatch".
- /// An empty vector may be returned if no thread origin extended
- /// backtrace capabilities are available.
- //------------------------------------------------------------------
- virtual const std::vector<ConstString> &
- GetExtendedBacktraceTypes ();
+ //------------------------------------------------------------------
+ /// Called before detaching from a process.
+ ///
+ /// This will give a SystemRuntime plugin a chance to free any resources
+ /// in the inferior process before we detach.
+ //------------------------------------------------------------------
+ virtual void Detach();
- //------------------------------------------------------------------
- /// Return a Thread which shows the origin of this thread's creation.
- ///
- /// This likely returns a HistoryThread which shows how thread was
- /// originally created (e.g. "pthread" type), or how the work that
- /// is currently executing on it was originally enqueued (e.g.
- /// "libdispatch" type).
- ///
- /// There may be a chain of thread-origins; it may be informative to
- /// the end user to query the returned ThreadSP for its origins as
- /// well.
- ///
- /// @param [in] thread
- /// The thread to examine.
- ///
- /// @param [in] type
- /// The type of thread origin being requested. The types supported
- /// are returned from SystemRuntime::GetExtendedBacktraceTypes.
- ///
- /// @return
- /// A ThreadSP which will have a StackList of frames. This Thread will
- /// not appear in the Process' list of current threads. Normal thread
- /// operations like stepping will not be available. This is a historical
- /// view thread and may be only useful for showing a backtrace.
- ///
- /// An empty ThreadSP will be returned if no thread origin is available.
- //------------------------------------------------------------------
- virtual lldb::ThreadSP
- GetExtendedBacktraceThread (lldb::ThreadSP thread, ConstString type);
+ //------------------------------------------------------------------
+ /// Return a list of thread origin extended backtraces that may
+ /// be available.
+ ///
+ /// A System Runtime may be able to provide a backtrace of when this
+ /// thread was originally created. Furthermore, it may be able to
+ /// provide that extended backtrace for different styles of creation.
+ /// On a system with both pthreads and libdispatch, aka Grand Central
+ /// Dispatch, queues, the system runtime may be able to provide the
+ /// pthread creation of the thread and it may also be able to provide
+ /// the backtrace of when this GCD queue work block was enqueued.
+ /// The caller may request these different origins by name.
+ ///
+ /// The names will be provided in the order that they are most likely
+ /// to be requested. For instance, a most natural order may be to
+ /// request the GCD libdispatch queue origin. If there is none, then
+ /// request the pthread origin.
+ ///
+ /// @return
+ /// A vector of ConstStrings with names like "pthread" or "libdispatch".
+ /// An empty vector may be returned if no thread origin extended
+ /// backtrace capabilities are available.
+ //------------------------------------------------------------------
+ virtual const std::vector<ConstString> &GetExtendedBacktraceTypes();
- //------------------------------------------------------------------
- /// Get the extended backtrace thread for a QueueItem
- ///
- /// A QueueItem represents a function/block that will be executed on
- /// a libdispatch queue in the future, or it represents a function/block
- /// that is currently executing on a thread.
- ///
- /// This method will report a thread backtrace of the function that
- /// enqueued it originally, if possible.
- ///
- /// @param [in] queue_item_sp
- /// The QueueItem that we are getting an extended backtrace for.
- ///
- /// @param [in] type
- /// The type of extended backtrace to fetch. The types supported
- /// are returned from SystemRuntime::GetExtendedBacktraceTypes.
- ///
- /// @return
- /// If an extended backtrace is available, it is returned. Else
- /// an empty ThreadSP is returned.
- //------------------------------------------------------------------
- virtual lldb::ThreadSP
- GetExtendedBacktraceForQueueItem (lldb::QueueItemSP queue_item_sp, ConstString type)
- {
- return lldb::ThreadSP();
- }
+ //------------------------------------------------------------------
+ /// Return a Thread which shows the origin of this thread's creation.
+ ///
+ /// This likely returns a HistoryThread which shows how thread was
+ /// originally created (e.g. "pthread" type), or how the work that
+ /// is currently executing on it was originally enqueued (e.g.
+ /// "libdispatch" type).
+ ///
+ /// There may be a chain of thread-origins; it may be informative to
+ /// the end user to query the returned ThreadSP for its origins as
+ /// well.
+ ///
+ /// @param [in] thread
+ /// The thread to examine.
+ ///
+ /// @param [in] type
+ /// The type of thread origin being requested. The types supported
+ /// are returned from SystemRuntime::GetExtendedBacktraceTypes.
+ ///
+ /// @return
+ /// A ThreadSP which will have a StackList of frames. This Thread will
+ /// not appear in the Process' list of current threads. Normal thread
+ /// operations like stepping will not be available. This is a historical
+ /// view thread and may be only useful for showing a backtrace.
+ ///
+ /// An empty ThreadSP will be returned if no thread origin is available.
+ //------------------------------------------------------------------
+ virtual lldb::ThreadSP GetExtendedBacktraceThread(lldb::ThreadSP thread,
+ ConstString type);
- //------------------------------------------------------------------
- /// Populate the Process' QueueList with libdispatch / GCD queues that exist.
- ///
- /// When process execution is paused, the SystemRuntime may be called to fill
- /// in the list of Queues that currently exist.
- ///
- /// @param [out] queue_list
- /// This QueueList will be cleared, and any queues that currently exist
- /// will be added. An empty QueueList will be returned if no queues
- /// exist or if this Systemruntime does not support libdispatch queues.
- //------------------------------------------------------------------
- virtual void
- PopulateQueueList (lldb_private::QueueList &queue_list)
- {
- }
+ //------------------------------------------------------------------
+ /// Get the extended backtrace thread for a QueueItem
+ ///
+ /// A QueueItem represents a function/block that will be executed on
+ /// a libdispatch queue in the future, or it represents a function/block
+ /// that is currently executing on a thread.
+ ///
+ /// This method will report a thread backtrace of the function that
+ /// enqueued it originally, if possible.
+ ///
+ /// @param [in] queue_item_sp
+ /// The QueueItem that we are getting an extended backtrace for.
+ ///
+ /// @param [in] type
+ /// The type of extended backtrace to fetch. The types supported
+ /// are returned from SystemRuntime::GetExtendedBacktraceTypes.
+ ///
+ /// @return
+ /// If an extended backtrace is available, it is returned. Else
+ /// an empty ThreadSP is returned.
+ //------------------------------------------------------------------
+ virtual lldb::ThreadSP
+ GetExtendedBacktraceForQueueItem(lldb::QueueItemSP queue_item_sp,
+ ConstString type) {
+ return lldb::ThreadSP();
+ }
- //------------------------------------------------------------------
- /// Get the queue name for a thread given a thread's dispatch_qaddr.
- ///
- /// On systems using libdispatch queues, a thread may be associated with a queue.
- /// There will be a call to get the thread's dispatch_qaddr. At the dispatch_qaddr
- /// we will find the address of this thread's dispatch_queue_t structure.
- /// Given the address of the dispatch_queue_t structure for a thread,
- /// get the queue name and return it.
- ///
- /// @param [in] dispatch_qaddr
- /// The address of the dispatch_qaddr pointer for this thread.
- ///
- /// @return
- /// The string of this queue's name. An empty string is returned if the
- /// name could not be found.
- //------------------------------------------------------------------
- virtual std::string
- GetQueueNameFromThreadQAddress (lldb::addr_t dispatch_qaddr)
- {
- return "";
- }
+ //------------------------------------------------------------------
+ /// Populate the Process' QueueList with libdispatch / GCD queues that exist.
+ ///
+ /// When process execution is paused, the SystemRuntime may be called to fill
+ /// in the list of Queues that currently exist.
+ ///
+ /// @param [out] queue_list
+ /// This QueueList will be cleared, and any queues that currently exist
+ /// will be added. An empty QueueList will be returned if no queues
+ /// exist or if this Systemruntime does not support libdispatch queues.
+ //------------------------------------------------------------------
+ virtual void PopulateQueueList(lldb_private::QueueList &queue_list) {}
- //------------------------------------------------------------------
- /// Get the QueueID for the libdispatch queue given the thread's dispatch_qaddr.
- ///
- /// On systems using libdispatch queues, a thread may be associated with a queue.
- /// There will be a call to get the thread's dispatch_qaddr. At the dispatch_qaddr
- /// we will find the address of this thread's dispatch_queue_t structure.
- /// Given the address of the dispatch_queue_t structure for a thread,
- /// get the queue ID and return it.
- ///
- /// @param [in] dispatch_qaddr
- /// The address of the dispatch_qaddr pointer for this thread.
- ///
- /// @return
- /// The queue ID, or if it could not be retrieved, LLDB_INVALID_QUEUE_ID.
- //------------------------------------------------------------------
- virtual lldb::queue_id_t
- GetQueueIDFromThreadQAddress (lldb::addr_t dispatch_qaddr)
- {
- return LLDB_INVALID_QUEUE_ID;
- }
+ //------------------------------------------------------------------
+ /// Get the queue name for a thread given a thread's dispatch_qaddr.
+ ///
+ /// On systems using libdispatch queues, a thread may be associated with a
+ /// queue.
+ /// There will be a call to get the thread's dispatch_qaddr. At the
+ /// dispatch_qaddr
+ /// we will find the address of this thread's dispatch_queue_t structure.
+ /// Given the address of the dispatch_queue_t structure for a thread,
+ /// get the queue name and return it.
+ ///
+ /// @param [in] dispatch_qaddr
+ /// The address of the dispatch_qaddr pointer for this thread.
+ ///
+ /// @return
+ /// The string of this queue's name. An empty string is returned if the
+ /// name could not be found.
+ //------------------------------------------------------------------
+ virtual std::string
+ GetQueueNameFromThreadQAddress(lldb::addr_t dispatch_qaddr) {
+ return "";
+ }
- //------------------------------------------------------------------
- /// Get the libdispatch_queue_t address for the queue given the thread's dispatch_qaddr.
- ///
- /// On systems using libdispatch queues, a thread may be associated with a queue.
- /// There will be a call to get the thread's dispatch_qaddr.
- /// Given the thread's dispatch_qaddr, find the libdispatch_queue_t address and
- /// return it.
- ///
- /// @param [in] dispatch_qaddr
- /// The address of the dispatch_qaddr pointer for this thread.
- ///
- /// @return
- /// The libdispatch_queue_t address, or LLDB_INVALID_ADDRESS if unavailable/not found.
- //------------------------------------------------------------------
- virtual lldb::addr_t
- GetLibdispatchQueueAddressFromThreadQAddress (lldb::addr_t dispatch_qaddr)
- {
- return LLDB_INVALID_ADDRESS;
- }
+ //------------------------------------------------------------------
+ /// Get the QueueID for the libdispatch queue given the thread's
+ /// dispatch_qaddr.
+ ///
+ /// On systems using libdispatch queues, a thread may be associated with a
+ /// queue.
+ /// There will be a call to get the thread's dispatch_qaddr. At the
+ /// dispatch_qaddr
+ /// we will find the address of this thread's dispatch_queue_t structure.
+ /// Given the address of the dispatch_queue_t structure for a thread,
+ /// get the queue ID and return it.
+ ///
+ /// @param [in] dispatch_qaddr
+ /// The address of the dispatch_qaddr pointer for this thread.
+ ///
+ /// @return
+ /// The queue ID, or if it could not be retrieved, LLDB_INVALID_QUEUE_ID.
+ //------------------------------------------------------------------
+ virtual lldb::queue_id_t
+ GetQueueIDFromThreadQAddress(lldb::addr_t dispatch_qaddr) {
+ return LLDB_INVALID_QUEUE_ID;
+ }
+ //------------------------------------------------------------------
+ /// Get the libdispatch_queue_t address for the queue given the thread's
+ /// dispatch_qaddr.
+ ///
+ /// On systems using libdispatch queues, a thread may be associated with a
+ /// queue.
+ /// There will be a call to get the thread's dispatch_qaddr.
+ /// Given the thread's dispatch_qaddr, find the libdispatch_queue_t address
+ /// and
+ /// return it.
+ ///
+ /// @param [in] dispatch_qaddr
+ /// The address of the dispatch_qaddr pointer for this thread.
+ ///
+ /// @return
+ /// The libdispatch_queue_t address, or LLDB_INVALID_ADDRESS if
+ /// unavailable/not found.
+ //------------------------------------------------------------------
+ virtual lldb::addr_t
+ GetLibdispatchQueueAddressFromThreadQAddress(lldb::addr_t dispatch_qaddr) {
+ return LLDB_INVALID_ADDRESS;
+ }
- //------------------------------------------------------------------
- /// Retrieve the Queue kind for the queue at a thread's dispatch_qaddr.
- ///
- /// Retrieve the Queue kind - either eQueueKindSerial or
- /// eQueueKindConcurrent, indicating that this queue processes work
- /// items serially or concurrently.
- ///
- /// @return
- /// The Queue kind, if it could be read, else eQueueKindUnknown.
- //------------------------------------------------------------------
- virtual lldb::QueueKind
- GetQueueKind (lldb::addr_t dispatch_qaddr)
- {
- return lldb::eQueueKindUnknown;
- }
+ //------------------------------------------------------------------
+ /// Retrieve the Queue kind for the queue at a thread's dispatch_qaddr.
+ ///
+ /// Retrieve the Queue kind - either eQueueKindSerial or
+ /// eQueueKindConcurrent, indicating that this queue processes work
+ /// items serially or concurrently.
+ ///
+ /// @return
+ /// The Queue kind, if it could be read, else eQueueKindUnknown.
+ //------------------------------------------------------------------
+ virtual lldb::QueueKind GetQueueKind(lldb::addr_t dispatch_qaddr) {
+ return lldb::eQueueKindUnknown;
+ }
- //------------------------------------------------------------------
- /// Get the pending work items for a libdispatch Queue
- ///
- /// If this system/process is using libdispatch and the runtime can do so,
- /// retrieve the list of pending work items for the specified Queue and
- /// add it to the Queue.
- ///
- /// @param [in] queue
- /// The queue of interest.
- //------------------------------------------------------------------
- virtual void
- PopulatePendingItemsForQueue (lldb_private::Queue *queue)
- {
- }
+ //------------------------------------------------------------------
+ /// Get the pending work items for a libdispatch Queue
+ ///
+ /// If this system/process is using libdispatch and the runtime can do so,
+ /// retrieve the list of pending work items for the specified Queue and
+ /// add it to the Queue.
+ ///
+ /// @param [in] queue
+ /// The queue of interest.
+ //------------------------------------------------------------------
+ virtual void PopulatePendingItemsForQueue(lldb_private::Queue *queue) {}
- //------------------------------------------------------------------
- /// Complete the fields in a QueueItem
- ///
- /// PopulatePendingItemsForQueue() may not fill in all of the QueueItem
- /// details; when the remaining fields are needed, they will be
- /// fetched by call this method.
- ///
- /// @param [in] queue_item
- /// The QueueItem that we will be completing.
- ///
- /// @param [in] item_ref
- /// The item_ref token that is needed to retrieve the rest of the
- /// information about the QueueItem.
- //------------------------------------------------------------------
- virtual void
- CompleteQueueItem (lldb_private::QueueItem *queue_item, lldb::addr_t item_ref)
- {
- }
+ //------------------------------------------------------------------
+ /// Complete the fields in a QueueItem
+ ///
+ /// PopulatePendingItemsForQueue() may not fill in all of the QueueItem
+ /// details; when the remaining fields are needed, they will be
+ /// fetched by call this method.
+ ///
+ /// @param [in] queue_item
+ /// The QueueItem that we will be completing.
+ ///
+ /// @param [in] item_ref
+ /// The item_ref token that is needed to retrieve the rest of the
+ /// information about the QueueItem.
+ //------------------------------------------------------------------
+ virtual void CompleteQueueItem(lldb_private::QueueItem *queue_item,
+ lldb::addr_t item_ref) {}
- //------------------------------------------------------------------
- /// Add key-value pairs to the StructuredData dictionary object with
- /// information debugserver may need when constructing the jThreadExtendedInfo
- /// packet.
- ///
- /// @param [out] dict
- /// Dictionary to which key-value pairs should be added; they will
- /// be sent to the remote gdb server stub as arguments in the
- /// jThreadExtendedInfo request.
- //------------------------------------------------------------------
- virtual void
- AddThreadExtendedInfoPacketHints (lldb_private::StructuredData::ObjectSP dict)
- {
- }
+ //------------------------------------------------------------------
+ /// Add key-value pairs to the StructuredData dictionary object with
+ /// information debugserver may need when constructing the
+ /// jThreadExtendedInfo
+ /// packet.
+ ///
+ /// @param [out] dict
+ /// Dictionary to which key-value pairs should be added; they will
+ /// be sent to the remote gdb server stub as arguments in the
+ /// jThreadExtendedInfo request.
+ //------------------------------------------------------------------
+ virtual void AddThreadExtendedInfoPacketHints(
+ lldb_private::StructuredData::ObjectSP dict) {}
- /// Determine whether it is safe to run an expression on a given thread
- ///
- /// If a system must not run functions on a thread in some particular state,
- /// this method gives a way for it to flag that the expression should not be
- /// run.
- ///
- /// @param [in] thread_sp
- /// The thread we want to run the expression on.
- ///
- /// @return
- /// True will be returned if there are no known problems with running an
- /// expression on this thread. False means that the inferior function
- /// call should not be made on this thread.
- //------------------------------------------------------------------
- virtual bool
- SafeToCallFunctionsOnThisThread (lldb::ThreadSP thread_sp)
- {
- return true;
- }
+ /// Determine whether it is safe to run an expression on a given thread
+ ///
+ /// If a system must not run functions on a thread in some particular state,
+ /// this method gives a way for it to flag that the expression should not be
+ /// run.
+ ///
+ /// @param [in] thread_sp
+ /// The thread we want to run the expression on.
+ ///
+ /// @return
+ /// True will be returned if there are no known problems with running an
+ /// expression on this thread. False means that the inferior function
+ /// call should not be made on this thread.
+ //------------------------------------------------------------------
+ virtual bool SafeToCallFunctionsOnThisThread(lldb::ThreadSP thread_sp) {
+ return true;
+ }
protected:
- //------------------------------------------------------------------
- // Member variables.
- //------------------------------------------------------------------
- Process *m_process;
+ //------------------------------------------------------------------
+ // Member variables.
+ //------------------------------------------------------------------
+ Process *m_process;
- std::vector<ConstString> m_types;
+ std::vector<ConstString> m_types;
private:
-
- DISALLOW_COPY_AND_ASSIGN (SystemRuntime);
+ DISALLOW_COPY_AND_ASSIGN(SystemRuntime);
};
} // namespace lldb_private