diff options
Diffstat (limited to 'source/Plugins/Process/Windows/Live/DebuggerThread.h')
| -rw-r--r-- | source/Plugins/Process/Windows/Live/DebuggerThread.h | 100 | 
1 files changed, 100 insertions, 0 deletions
diff --git a/source/Plugins/Process/Windows/Live/DebuggerThread.h b/source/Plugins/Process/Windows/Live/DebuggerThread.h new file mode 100644 index 0000000000000..6a26194139508 --- /dev/null +++ b/source/Plugins/Process/Windows/Live/DebuggerThread.h @@ -0,0 +1,100 @@ +//===-- DebuggerThread.h ----------------------------------------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_Plugins_Process_Windows_DebuggerThread_H_ +#define liblldb_Plugins_Process_Windows_DebuggerThread_H_ + +#include <atomic> +#include <memory> + +#include "ForwardDecl.h" +#include "lldb/Host/HostProcess.h" +#include "lldb/Host/HostThread.h" +#include "lldb/Host/Predicate.h" +#include "lldb/Host/windows/windows.h" + +namespace lldb_private +{ + +//---------------------------------------------------------------------- +// DebuggerThread +// +// Debugs a single process, notifying listeners as appropriate when interesting +// things occur. +//---------------------------------------------------------------------- +class DebuggerThread : public std::enable_shared_from_this<DebuggerThread> +{ +  public: +    DebuggerThread(DebugDelegateSP debug_delegate); +    virtual ~DebuggerThread(); + +    Error DebugLaunch(const ProcessLaunchInfo &launch_info); +    Error DebugAttach(lldb::pid_t pid, const ProcessAttachInfo &attach_info); + +    HostProcess +    GetProcess() const +    { +        return m_process; +    } +    HostThread +    GetMainThread() const +    { +        return m_main_thread; +    } +    std::weak_ptr<ExceptionRecord> +    GetActiveException() +    { +        return m_active_exception; +    } + +    Error StopDebugging(bool terminate); + +    void ContinueAsyncException(ExceptionResult result); + +  private: +    void FreeProcessHandles(); +    void DebugLoop(); +    ExceptionResult HandleExceptionEvent(const EXCEPTION_DEBUG_INFO &info, DWORD thread_id); +    DWORD HandleCreateThreadEvent(const CREATE_THREAD_DEBUG_INFO &info, DWORD thread_id); +    DWORD HandleCreateProcessEvent(const CREATE_PROCESS_DEBUG_INFO &info, DWORD thread_id); +    DWORD HandleExitThreadEvent(const EXIT_THREAD_DEBUG_INFO &info, DWORD thread_id); +    DWORD HandleExitProcessEvent(const EXIT_PROCESS_DEBUG_INFO &info, DWORD thread_id); +    DWORD HandleLoadDllEvent(const LOAD_DLL_DEBUG_INFO &info, DWORD thread_id); +    DWORD HandleUnloadDllEvent(const UNLOAD_DLL_DEBUG_INFO &info, DWORD thread_id); +    DWORD HandleODSEvent(const OUTPUT_DEBUG_STRING_INFO &info, DWORD thread_id); +    DWORD HandleRipEvent(const RIP_INFO &info, DWORD thread_id); + +    DebugDelegateSP m_debug_delegate; + +    HostProcess m_process;    // The process being debugged. +    HostThread m_main_thread; // The main thread of the inferior. +    HANDLE m_image_file;      // The image file of the process being debugged. + +    ExceptionRecordSP m_active_exception; // The current exception waiting to be handled + +    Predicate<ExceptionResult> m_exception_pred; // A predicate which gets signalled when an exception +                                                 // is finished processing and the debug loop can be +                                                 // continued. + +    HANDLE m_debugging_ended_event; // An event which gets signalled by the debugger thread when it +                                    // exits the debugger loop and is detached from the inferior. + +    std::atomic<DWORD> m_pid_to_detach;  // Signals the loop to detach from the process (specified by pid). +    std::atomic<bool> m_is_shutting_down;   // Signals the debug loop to stop processing certain types of +                                            // events that block shutdown. +    bool m_detached;  // Indicates we've detached from the inferior process and the debug loop can exit. + +    static lldb::thread_result_t DebuggerThreadLaunchRoutine(void *data); +    lldb::thread_result_t DebuggerThreadLaunchRoutine(const ProcessLaunchInfo &launch_info); +    static lldb::thread_result_t DebuggerThreadAttachRoutine(void *data); +    lldb::thread_result_t DebuggerThreadAttachRoutine(lldb::pid_t pid, const ProcessAttachInfo &launch_info); +}; +} + +#endif  | 
