diff options
Diffstat (limited to 'include/lldb/Core/Debugger.h')
-rw-r--r-- | include/lldb/Core/Debugger.h | 784 |
1 files changed, 337 insertions, 447 deletions
diff --git a/include/lldb/Core/Debugger.h b/include/lldb/Core/Debugger.h index 7a969457eef6..ccc07b30f0c6 100644 --- a/include/lldb/Core/Debugger.h +++ b/include/lldb/Core/Debugger.h @@ -14,14 +14,13 @@ #include <stdint.h> // C++ Includes -#include <memory> #include <map> +#include <memory> #include <mutex> #include <vector> // Other libraries and framework includes // Project includes -#include "lldb/lldb-public.h" #include "lldb/Core/Broadcaster.h" #include "lldb/Core/FormatEntity.h" #include "lldb/Core/IOHandler.h" @@ -33,11 +32,10 @@ #include "lldb/Host/Terminal.h" #include "lldb/Target/Platform.h" #include "lldb/Target/TargetList.h" +#include "lldb/lldb-public.h" -namespace llvm -{ -namespace sys -{ +namespace llvm { +namespace sys { class DynamicLibrary; } // namespace sys } // namespace llvm @@ -51,454 +49,346 @@ namespace lldb_private { /// Provides a global root objects for the debugger core. //---------------------------------------------------------------------- -class Debugger : - public std::enable_shared_from_this<Debugger>, - public UserID, - public Properties -{ -friend class SourceManager; // For GetSourceFileCache. +class Debugger : public std::enable_shared_from_this<Debugger>, + public UserID, + public Properties { + friend class SourceManager; // For GetSourceFileCache. public: - ~Debugger() override; - - static lldb::DebuggerSP - CreateInstance(lldb::LogOutputCallback log_callback = nullptr, void *baton = nullptr); - - static lldb::TargetSP - FindTargetWithProcessID (lldb::pid_t pid); - - static lldb::TargetSP - FindTargetWithProcess (Process *process); - - static void - Initialize(LoadPluginCallbackType load_plugin_callback); - - static void - Terminate(); - - static void - SettingsInitialize (); - - static void - SettingsTerminate (); - - static void - Destroy (lldb::DebuggerSP &debugger_sp); - - static lldb::DebuggerSP - FindDebuggerWithID(lldb::user_id_t id); - - static lldb::DebuggerSP - FindDebuggerWithInstanceName(const ConstString &instance_name); - - static size_t - GetNumDebuggers(); - - static lldb::DebuggerSP - GetDebuggerAtIndex(size_t index); - - static bool - FormatDisassemblerAddress(const FormatEntity::Entry *format, - const SymbolContext *sc, - const SymbolContext *prev_sc, - const ExecutionContext *exe_ctx, - const Address *addr, - Stream &s); - - void Clear(); - - bool - GetAsyncExecution (); - - void - SetAsyncExecution (bool async); - - lldb::StreamFileSP - GetInputFile () - { - return m_input_file_sp; - } - - lldb::StreamFileSP - GetOutputFile () - { - return m_output_file_sp; - } - - lldb::StreamFileSP - GetErrorFile () - { - return m_error_file_sp; - } - - void - SetInputFileHandle (FILE *fh, bool tranfer_ownership); - - void - SetOutputFileHandle (FILE *fh, bool tranfer_ownership); - - void - SetErrorFileHandle (FILE *fh, bool tranfer_ownership); - - void - SaveInputTerminalState(); - - void - RestoreInputTerminalState(); - - lldb::StreamSP - GetAsyncOutputStream (); - - lldb::StreamSP - GetAsyncErrorStream (); - - CommandInterpreter & - GetCommandInterpreter () - { - assert (m_command_interpreter_ap.get()); - return *m_command_interpreter_ap; - } - - lldb::ListenerSP - GetListener () - { - return m_listener_sp; - } - - // This returns the Debugger's scratch source manager. It won't be able to look up files in debug - // information, but it can look up files by absolute path and display them to you. - // To get the target's source manager, call GetSourceManager on the target instead. - SourceManager & - GetSourceManager (); - - lldb::TargetSP - GetSelectedTarget () - { - return m_target_list.GetSelectedTarget (); - } - - ExecutionContext - GetSelectedExecutionContext(); - //------------------------------------------------------------------ - /// Get accessor for the target list. - /// - /// The target list is part of the global debugger object. This - /// the single debugger shared instance to control where targets - /// get created and to allow for tracking and searching for targets - /// based on certain criteria. - /// - /// @return - /// A global shared target list. - //------------------------------------------------------------------ - TargetList & - GetTargetList () - { - return m_target_list; - } - - PlatformList & - GetPlatformList () - { - return m_platform_list; - } - - void - DispatchInputInterrupt (); - - void - DispatchInputEndOfFile (); - - //------------------------------------------------------------------ - // If any of the streams are not set, set them to the in/out/err - // stream of the top most input reader to ensure they at least have - // something - //------------------------------------------------------------------ - void - AdoptTopIOHandlerFilesIfInvalid (lldb::StreamFileSP &in, - lldb::StreamFileSP &out, - lldb::StreamFileSP &err); - - void - PushIOHandler (const lldb::IOHandlerSP& reader_sp); - - bool - PopIOHandler (const lldb::IOHandlerSP& reader_sp); - - // Synchronously run an input reader until it is done - void - RunIOHandler (const lldb::IOHandlerSP& reader_sp); - - bool - IsTopIOHandler (const lldb::IOHandlerSP& reader_sp); - - bool - CheckTopIOHandlerTypes (IOHandler::Type top_type, - IOHandler::Type second_top_type); - - void - PrintAsync (const char *s, size_t len, bool is_stdout); - - ConstString - GetTopIOHandlerControlSequence(char ch); - - const char * - GetIOHandlerCommandPrefix(); - - const char * - GetIOHandlerHelpPrologue(); - - void - ClearIOHandlers (); - - bool - GetCloseInputOnEOF () const; - - void - SetCloseInputOnEOF (bool b); - - bool - EnableLog (const char *channel, const char **categories, const char *log_file, uint32_t log_options, Stream &error_stream); - - void - SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton); - - //---------------------------------------------------------------------- - // Properties Functions - //---------------------------------------------------------------------- - enum StopDisassemblyType - { - eStopDisassemblyTypeNever = 0, - eStopDisassemblyTypeNoDebugInfo, - eStopDisassemblyTypeNoSource, - eStopDisassemblyTypeAlways - }; - - Error - SetPropertyValue(const ExecutionContext *exe_ctx, - VarSetOperationType op, - const char *property_path, - const char *value) override; - - bool - GetAutoConfirm () const; - - const FormatEntity::Entry * - GetDisassemblyFormat() const; - - const FormatEntity::Entry * - GetFrameFormat() const; - - const FormatEntity::Entry * - GetThreadFormat() const; - - lldb::ScriptLanguage - GetScriptLanguage() const; - - bool - SetScriptLanguage (lldb::ScriptLanguage script_lang); - - uint32_t - GetTerminalWidth () const; - - bool - SetTerminalWidth (uint32_t term_width); - - const char * - GetPrompt() const; - - void - SetPrompt(const char *p); - - bool - GetUseExternalEditor () const; - - bool - SetUseExternalEditor (bool use_external_editor_p); - - bool - GetUseColor () const; - - bool - SetUseColor (bool use_color); - - uint32_t - GetStopSourceLineCount (bool before) const; - - StopDisassemblyType - GetStopDisassemblyDisplay () const; - - uint32_t - GetDisassemblyLineCount () const; - - bool - GetAutoOneLineSummaries () const; - - bool - GetAutoIndent () const; - - bool - SetAutoIndent (bool b); - - bool - GetPrintDecls () const; - - bool - SetPrintDecls (bool b); - - uint32_t - GetTabSize () const; - - bool - SetTabSize (uint32_t tab_size); - - bool - GetEscapeNonPrintables () const; - - bool - GetNotifyVoid () const; - - const ConstString & - GetInstanceName() - { - return m_instance_name; - } - - bool - LoadPlugin (const FileSpec& spec, Error& error); - - void - ExecuteIOHandlers(); - - bool - IsForwardingEvents (); - - void - EnableForwardEvents (const lldb::ListenerSP &listener_sp); - - void - CancelForwardEvents (const lldb::ListenerSP &listener_sp); - - bool - IsHandlingEvents () const - { - return m_event_handler_thread.IsJoinable(); - } - - Error - RunREPL (lldb::LanguageType language, const char *repl_options); - - // This is for use in the command interpreter, when you either want the selected target, or if no target - // is present you want to prime the dummy target with entities that will be copied over to new targets. - Target *GetSelectedOrDummyTarget(bool prefer_dummy = false); - Target *GetDummyTarget(); - - lldb::BroadcasterManagerSP - GetBroadcasterManager() - { - return m_broadcaster_manager_sp; - } + ~Debugger() override; + + static lldb::DebuggerSP + CreateInstance(lldb::LogOutputCallback log_callback = nullptr, + void *baton = nullptr); + + static lldb::TargetSP FindTargetWithProcessID(lldb::pid_t pid); + + static lldb::TargetSP FindTargetWithProcess(Process *process); + + static void Initialize(LoadPluginCallbackType load_plugin_callback); + + static void Terminate(); + + static void SettingsInitialize(); + + static void SettingsTerminate(); + + static void Destroy(lldb::DebuggerSP &debugger_sp); + + static lldb::DebuggerSP FindDebuggerWithID(lldb::user_id_t id); + + static lldb::DebuggerSP + FindDebuggerWithInstanceName(const ConstString &instance_name); + + static size_t GetNumDebuggers(); + + static lldb::DebuggerSP GetDebuggerAtIndex(size_t index); + + static bool FormatDisassemblerAddress(const FormatEntity::Entry *format, + const SymbolContext *sc, + const SymbolContext *prev_sc, + const ExecutionContext *exe_ctx, + const Address *addr, Stream &s); + + void Clear(); + + bool GetAsyncExecution(); + + void SetAsyncExecution(bool async); + + lldb::StreamFileSP GetInputFile() { return m_input_file_sp; } + + lldb::StreamFileSP GetOutputFile() { return m_output_file_sp; } + + lldb::StreamFileSP GetErrorFile() { return m_error_file_sp; } + + void SetInputFileHandle(FILE *fh, bool tranfer_ownership); + + void SetOutputFileHandle(FILE *fh, bool tranfer_ownership); + + void SetErrorFileHandle(FILE *fh, bool tranfer_ownership); + + void SaveInputTerminalState(); + + void RestoreInputTerminalState(); + + lldb::StreamSP GetAsyncOutputStream(); + + lldb::StreamSP GetAsyncErrorStream(); + + CommandInterpreter &GetCommandInterpreter() { + assert(m_command_interpreter_ap.get()); + return *m_command_interpreter_ap; + } + + lldb::ListenerSP GetListener() { return m_listener_sp; } + + // This returns the Debugger's scratch source manager. It won't be able to + // look up files in debug + // information, but it can look up files by absolute path and display them to + // you. + // To get the target's source manager, call GetSourceManager on the target + // instead. + SourceManager &GetSourceManager(); + + lldb::TargetSP GetSelectedTarget() { + return m_target_list.GetSelectedTarget(); + } + + ExecutionContext GetSelectedExecutionContext(); + //------------------------------------------------------------------ + /// Get accessor for the target list. + /// + /// The target list is part of the global debugger object. This + /// the single debugger shared instance to control where targets + /// get created and to allow for tracking and searching for targets + /// based on certain criteria. + /// + /// @return + /// A global shared target list. + //------------------------------------------------------------------ + TargetList &GetTargetList() { return m_target_list; } + + PlatformList &GetPlatformList() { return m_platform_list; } + + void DispatchInputInterrupt(); + + void DispatchInputEndOfFile(); + + //------------------------------------------------------------------ + // If any of the streams are not set, set them to the in/out/err + // stream of the top most input reader to ensure they at least have + // something + //------------------------------------------------------------------ + void AdoptTopIOHandlerFilesIfInvalid(lldb::StreamFileSP &in, + lldb::StreamFileSP &out, + lldb::StreamFileSP &err); + + void PushIOHandler(const lldb::IOHandlerSP &reader_sp); + + bool PopIOHandler(const lldb::IOHandlerSP &reader_sp); + + // Synchronously run an input reader until it is done + void RunIOHandler(const lldb::IOHandlerSP &reader_sp); + + bool IsTopIOHandler(const lldb::IOHandlerSP &reader_sp); + + bool CheckTopIOHandlerTypes(IOHandler::Type top_type, + IOHandler::Type second_top_type); + + void PrintAsync(const char *s, size_t len, bool is_stdout); + + ConstString GetTopIOHandlerControlSequence(char ch); + + const char *GetIOHandlerCommandPrefix(); + + const char *GetIOHandlerHelpPrologue(); + + void ClearIOHandlers(); + + bool GetCloseInputOnEOF() const; + + void SetCloseInputOnEOF(bool b); + + bool EnableLog(const char *channel, const char **categories, + const char *log_file, uint32_t log_options, + Stream &error_stream); + + void SetLoggingCallback(lldb::LogOutputCallback log_callback, void *baton); + + //---------------------------------------------------------------------- + // Properties Functions + //---------------------------------------------------------------------- + enum StopDisassemblyType { + eStopDisassemblyTypeNever = 0, + eStopDisassemblyTypeNoDebugInfo, + eStopDisassemblyTypeNoSource, + eStopDisassemblyTypeAlways + }; + + Error SetPropertyValue(const ExecutionContext *exe_ctx, + VarSetOperationType op, llvm::StringRef property_path, + llvm::StringRef value) override; + + bool GetAutoConfirm() const; + + const FormatEntity::Entry *GetDisassemblyFormat() const; + + const FormatEntity::Entry *GetFrameFormat() const; + + const FormatEntity::Entry *GetThreadFormat() const; + + const FormatEntity::Entry *GetThreadStopFormat() const; + + lldb::ScriptLanguage GetScriptLanguage() const; + + bool SetScriptLanguage(lldb::ScriptLanguage script_lang); + + uint32_t GetTerminalWidth() const; + + bool SetTerminalWidth(uint32_t term_width); + + llvm::StringRef GetPrompt() const; + + void SetPrompt(llvm::StringRef p); + void SetPrompt(const char *) = delete; + + bool GetUseExternalEditor() const; + + bool SetUseExternalEditor(bool use_external_editor_p); + + bool GetUseColor() const; + + bool SetUseColor(bool use_color); + + lldb::StopShowColumn GetStopShowColumn() const; + + const FormatEntity::Entry *GetStopShowColumnAnsiPrefix() const; + + const FormatEntity::Entry *GetStopShowColumnAnsiSuffix() const; + + uint32_t GetStopSourceLineCount(bool before) const; + + StopDisassemblyType GetStopDisassemblyDisplay() const; + + uint32_t GetDisassemblyLineCount() const; + + bool GetAutoOneLineSummaries() const; + + bool GetAutoIndent() const; + + bool SetAutoIndent(bool b); + + bool GetPrintDecls() const; + + bool SetPrintDecls(bool b); + + uint32_t GetTabSize() const; + + bool SetTabSize(uint32_t tab_size); + + bool GetEscapeNonPrintables() const; + + bool GetNotifyVoid() const; + + const ConstString &GetInstanceName() { return m_instance_name; } + + bool LoadPlugin(const FileSpec &spec, Error &error); + + void ExecuteIOHandlers(); + + bool IsForwardingEvents(); + + void EnableForwardEvents(const lldb::ListenerSP &listener_sp); + + void CancelForwardEvents(const lldb::ListenerSP &listener_sp); + + bool IsHandlingEvents() const { return m_event_handler_thread.IsJoinable(); } + + Error RunREPL(lldb::LanguageType language, const char *repl_options); + + // This is for use in the command interpreter, when you either want the + // selected target, or if no target + // is present you want to prime the dummy target with entities that will be + // copied over to new targets. + Target *GetSelectedOrDummyTarget(bool prefer_dummy = false); + Target *GetDummyTarget(); + + lldb::BroadcasterManagerSP GetBroadcasterManager() { + return m_broadcaster_manager_sp; + } protected: - friend class CommandInterpreter; - friend class REPL; - - bool - StartEventHandlerThread(); - - void - StopEventHandlerThread(); - - static lldb::thread_result_t - EventHandlerThread (lldb::thread_arg_t arg); - - bool - HasIOHandlerThread(); - - bool - StartIOHandlerThread(); - - void - StopIOHandlerThread(); - - void - JoinIOHandlerThread(); - - static lldb::thread_result_t - IOHandlerThread (lldb::thread_arg_t arg); - - void - DefaultEventHandler(); - - void - HandleBreakpointEvent (const lldb::EventSP &event_sp); - - void - HandleProcessEvent (const lldb::EventSP &event_sp); - - void - HandleThreadEvent (const lldb::EventSP &event_sp); - - size_t - GetProcessSTDOUT (Process *process, Stream *stream); - - size_t - GetProcessSTDERR (Process *process, Stream *stream); - - SourceManager::SourceFileCache & - GetSourceFileCache () - { - return m_source_file_cache; - } - - void - InstanceInitialize (); - - lldb::StreamFileSP m_input_file_sp; - lldb::StreamFileSP m_output_file_sp; - lldb::StreamFileSP m_error_file_sp; - - lldb::BroadcasterManagerSP m_broadcaster_manager_sp; // The debugger acts as a broadcaster manager of last resort. - // It needs to get constructed before the target_list or any other - // member that might want to broadcast through the debugger. - - TerminalState m_terminal_state; - TargetList m_target_list; - - PlatformList m_platform_list; - lldb::ListenerSP m_listener_sp; - std::unique_ptr<SourceManager> m_source_manager_ap; // This is a scratch source manager that we return if we have no targets. - SourceManager::SourceFileCache m_source_file_cache; // All the source managers for targets created in this debugger used this shared - // source file cache. - std::unique_ptr<CommandInterpreter> m_command_interpreter_ap; - - IOHandlerStack m_input_reader_stack; - typedef std::map<std::string, lldb::StreamWP> LogStreamMap; - LogStreamMap m_log_streams; - lldb::StreamSP m_log_callback_stream_sp; - ConstString m_instance_name; - static LoadPluginCallbackType g_load_plugin_callback; - typedef std::vector<llvm::sys::DynamicLibrary> LoadedPluginsList; - LoadedPluginsList m_loaded_plugins; - HostThread m_event_handler_thread; - HostThread m_io_handler_thread; - Broadcaster m_sync_broadcaster; - lldb::ListenerSP m_forward_listener_sp; - std::once_flag m_clear_once; - - //---------------------------------------------------------------------- - // Events for m_sync_broadcaster - //---------------------------------------------------------------------- - enum - { - eBroadcastBitEventThreadIsListening = (1 << 0), - }; + friend class CommandInterpreter; + friend class REPL; + + bool StartEventHandlerThread(); + + void StopEventHandlerThread(); + + static lldb::thread_result_t EventHandlerThread(lldb::thread_arg_t arg); + + bool HasIOHandlerThread(); + + bool StartIOHandlerThread(); + + void StopIOHandlerThread(); + + void JoinIOHandlerThread(); + + static lldb::thread_result_t IOHandlerThread(lldb::thread_arg_t arg); + + void DefaultEventHandler(); + + void HandleBreakpointEvent(const lldb::EventSP &event_sp); + + void HandleProcessEvent(const lldb::EventSP &event_sp); + + void HandleThreadEvent(const lldb::EventSP &event_sp); + + size_t GetProcessSTDOUT(Process *process, Stream *stream); + + size_t GetProcessSTDERR(Process *process, Stream *stream); + + SourceManager::SourceFileCache &GetSourceFileCache() { + return m_source_file_cache; + } + + void InstanceInitialize(); + + lldb::StreamFileSP m_input_file_sp; + lldb::StreamFileSP m_output_file_sp; + lldb::StreamFileSP m_error_file_sp; + + lldb::BroadcasterManagerSP m_broadcaster_manager_sp; // The debugger acts as a + // broadcaster manager of + // last resort. + // It needs to get constructed before the target_list or any other + // member that might want to broadcast through the debugger. + + TerminalState m_terminal_state; + TargetList m_target_list; + + PlatformList m_platform_list; + lldb::ListenerSP m_listener_sp; + std::unique_ptr<SourceManager> m_source_manager_ap; // This is a scratch + // source manager that we + // return if we have no + // targets. + SourceManager::SourceFileCache m_source_file_cache; // All the source managers + // for targets created in + // this debugger used this + // shared + // source file cache. + std::unique_ptr<CommandInterpreter> m_command_interpreter_ap; + + IOHandlerStack m_input_reader_stack; + typedef std::map<std::string, lldb::StreamWP> LogStreamMap; + LogStreamMap m_log_streams; + lldb::StreamSP m_log_callback_stream_sp; + ConstString m_instance_name; + static LoadPluginCallbackType g_load_plugin_callback; + typedef std::vector<llvm::sys::DynamicLibrary> LoadedPluginsList; + LoadedPluginsList m_loaded_plugins; + HostThread m_event_handler_thread; + HostThread m_io_handler_thread; + Broadcaster m_sync_broadcaster; + lldb::ListenerSP m_forward_listener_sp; + std::once_flag m_clear_once; + + //---------------------------------------------------------------------- + // Events for m_sync_broadcaster + //---------------------------------------------------------------------- + enum { + eBroadcastBitEventThreadIsListening = (1 << 0), + }; private: - // Use Debugger::CreateInstance() to get a shared pointer to a new - // debugger object - Debugger (lldb::LogOutputCallback m_log_callback, void *baton); + // Use Debugger::CreateInstance() to get a shared pointer to a new + // debugger object + Debugger(lldb::LogOutputCallback m_log_callback, void *baton); - DISALLOW_COPY_AND_ASSIGN (Debugger); + DISALLOW_COPY_AND_ASSIGN(Debugger); }; } // namespace lldb_private |