| Index: experimental/windows_debugger/debugger/core/debuggee_process.h
|
| diff --git a/experimental/windows_debugger/debugger/core/debuggee_process.h b/experimental/windows_debugger/debugger/core/debuggee_process.h
|
| deleted file mode 100644
|
| index 33c84e58f42e2f84061fdaaabc1e8965dc4d2907..0000000000000000000000000000000000000000
|
| --- a/experimental/windows_debugger/debugger/core/debuggee_process.h
|
| +++ /dev/null
|
| @@ -1,241 +0,0 @@
|
| -// Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -#ifndef DEBUGGER_CORE_DEBUGGEE_PROCESS_H_
|
| -#define DEBUGGER_CORE_DEBUGGEE_PROCESS_H_
|
| -#include <windows.h>
|
| -#include <deque>
|
| -#include <map>
|
| -#include "debugger/core/debug_event.h"
|
| -#include "debugger/core/debuggee_iprocess.h"
|
| -#include "debugger/core/debuggee_thread.h"
|
| -
|
| -/// \brief This namespace groups classes related to OOP (out-of-process)
|
| -/// Windows debugger.
|
| -namespace debug {
|
| -class Breakpoint;
|
| -class DebugAPI;
|
| -
|
| -/// This class represents a process in debugged application.
|
| -
|
| -/// Class diagram (and more) is here:
|
| -/// https://docs.google.com/a/google.com/document/d/1lTN-IYqDd_oy9XQg9-zlNc_vbg-qyr4q2MKNEjhSA84/edit?hl=en&authkey=CJyJlOgF#
|
| -///
|
| -/// Note: most methods shall be called from one thread, this is limitation
|
| -/// of Windows debug API, here's links to Microsoft documentation:
|
| -/// http://msdn.microsoft.com/en-us/library/ms681423%28v=VS.85%29.aspx
|
| -/// http://msdn.microsoft.com/en-us/library/ms681675%28v=vs.85%29.aspx
|
| -/// Simple accessors can be called from any thread.
|
| -///
|
| -/// Note: not thread-safe.
|
| -class DebuggeeProcess : public IDebuggeeProcess {
|
| - public:
|
| - /// Creates a DebuggeeProcess object. There's no need to close
|
| - /// |handle|, system will close handle when thread terminates.
|
| - /// |file_handle| shall be closed.
|
| - /// @param[in] id process id
|
| - /// @param[in] handle a handle to the process
|
| - /// @param[in] file_handle a handle to the process's image file
|
| - /// @param[in] debug_api pointer to DebugAPI object,
|
| - /// system debug API (or mock) is called though 'debug_api'.
|
| - /// DebuggeeProcess don't not takes ownership of |debug_api|.
|
| - /// If |debug_api| is NULL, default DebugAPI is used,
|
| - /// the one that passes calls to system calls.
|
| - DebuggeeProcess(int id,
|
| - HANDLE handle,
|
| - HANDLE file_handle,
|
| - DebugAPI* debug_api);
|
| - virtual ~DebuggeeProcess();
|
| -
|
| - /// @return id of the process
|
| - virtual int id() const { return id_; }
|
| -
|
| - /// @return handle of the process
|
| - virtual HANDLE handle() const { return handle_; }
|
| -
|
| - /// @return handle of the process image file
|
| - virtual HANDLE file_handle() const { return file_handle_; }
|
| -
|
| - virtual State state() const { return state_; }
|
| - virtual bool IsHalted() const { return kHalted == state(); }
|
| -
|
| - /// Shall be called only on dead processes (i.e. state_ == kDead).
|
| - /// @return exit code or exception number, if process is terminated
|
| - /// by exception.
|
| - virtual int return_code() const { return exit_code_; }
|
| -
|
| - /// @return reference to last received debug event
|
| - virtual const DebugEvent& last_debug_event() const {
|
| - return last_debug_event_;
|
| - }
|
| -
|
| - virtual DebugAPI& debug_api() { return debug_api_; }
|
| -
|
| - /// @return address of memory region where nexe is loaded.
|
| - virtual void* nexe_mem_base() const { return nexe_mem_base_; }
|
| -
|
| - virtual void set_nexe_mem_base(void* addr) { nexe_mem_base_ = addr; }
|
| -
|
| - /// @return code address of nexe _start() routine.
|
| - virtual void* nexe_entry_point() const { return nexe_entry_point_; }
|
| -
|
| - virtual void set_nexe_entry_point(void* addr) { nexe_entry_point_ = addr; }
|
| -
|
| - /// @return word size of the debuggee process (32 or 64).
|
| - virtual int GetWordSizeInBits();
|
| -
|
| - /// @return true for WoW (windows-on-windows) processes -
|
| - /// i.e. 32-bit processes running on 64-bit windows.
|
| - virtual bool IsWoW();
|
| -
|
| - /// Allows process execution to continue (i.e. it calls
|
| - /// ContinueDebugEvent() for halted thread).
|
| - /// Shall be called only on halted process, and only from the thread that
|
| - /// started the debuggee.
|
| - virtual bool Continue();
|
| -
|
| - /// Allows process execution to continue. If thread was halted due
|
| - /// to exception, that exception is passed to the debugee thread.
|
| - /// Shall be called only on halted process, and only from the thread that
|
| - /// started the debuggee.
|
| - virtual bool ContinueAndPassExceptionToDebuggee();
|
| -
|
| - /// Cause halted thread to execute single CPU instruction.
|
| - /// Shall be called only on halted process, and only from the thread that
|
| - /// started the debuggee.
|
| - /// Does not block waiting for SINGLE_STEP exception.
|
| - /// Other events can arrive before SINGLE_STEP due to activity of
|
| - /// other threads.
|
| - virtual bool SingleStep();
|
| -
|
| - /// Cause running process to break (calls
|
| - /// debug::DebugApi::DebugBreakProcess).
|
| - /// Shall not be called on halted process, and only from the thread that
|
| - /// started the debuggee.
|
| - /// Returns before process is stopped, it just initiates breaking debuggee
|
| - /// process. As a result, system will create another thread in debuggee
|
| - /// process, and then that tread executs a trap instruction, causing
|
| - /// delivery of breakpoint exception to the debugger.
|
| - virtual bool Break();
|
| -
|
| - /// Initiates termination of all threads of the process.
|
| - /// Event loop should process exiting debug event before DebuggeeProcess
|
| - /// object gets into kDead state and can be safely deleted.
|
| - /// TODO(garianov): verify that |Kill| can be called from any thread.
|
| - virtual bool Kill();
|
| -
|
| - /// Detaches debugger fom the process. Debuggee process is not killed,
|
| - /// it runs freely after debugger is detached.
|
| - /// TODO(garianov): verify that |Detach| can be called from any thread.
|
| - virtual bool Detach();
|
| -
|
| - /// @return a pointer to the thread object, or NULL if there's
|
| - /// no thread with such |id|.
|
| - /// Thread object is owned by the process.
|
| - virtual DebuggeeThread* GetThread(int id);
|
| -
|
| - /// @return a poiner to the halted thread object, or NULL
|
| - /// if process is not halted.
|
| - /// Thread object is owned by the process.
|
| - virtual DebuggeeThread* GetHaltedThread();
|
| -
|
| - /// @return all thread ids.
|
| - virtual void GetThreadIds(std::deque<int>* threads) const;
|
| -
|
| - /// Copies memory from debuggee process to debugger buffer.
|
| - /// Shall be called only on halted process. There's no harm though if you
|
| - /// call it on running process.
|
| - /// @param[in] addr address (in debugger address space) from where to read.
|
| - /// @param[in] size number of bytes to read.
|
| - /// @param[out] destination destination buffer (in debugger address space).
|
| - /// TODO(garianov): verify that |ReadMemory| can be called from any thread.
|
| - virtual bool ReadMemory(const void* addr, size_t size, void* destination);
|
| -
|
| - /// Copies memory from debugger to debuggee process.
|
| - /// Shall be called only on halted process.
|
| - /// @param[in] addr address (in debugger address space) where to write.
|
| - /// @param[in] size number of bytes to write.
|
| - /// @param[in] source address of source buffer.
|
| - /// TODO(garianov): verify that |WriteMemory| can be called from any thread.
|
| - virtual bool WriteMemory(const void* addr, size_t size, const void* source);
|
| -
|
| - /// Sets breakpoint at specified address |addr|.
|
| - /// Shall be called only on halted process.
|
| - /// Note: for NaCl threads, breakpoints are supported only in nexe code,
|
| - /// i.e. breakpoints in TCB won't work.
|
| - /// TODO(garianov): add support for breakpoints in TCB.
|
| - /// @param[in] addr address where breakpoint shall be.
|
| - /// @return false if process is not able to access memory at |addr|,
|
| - /// or process is not halted, or if there is breakpoint with the same |addr|.
|
| - virtual bool SetBreakpoint(void* addr);
|
| -
|
| - /// Removes breakpoint at specified address |addr|.
|
| - /// Shall be called only on halted process.
|
| - /// @param[in] addr address of breakpoint.
|
| - /// @return false if process is not halted.
|
| - virtual bool RemoveBreakpoint(void* addr);
|
| -
|
| - /// @return breakpoint object, or NULL if there's no breakpoint
|
| - /// set at |addr|.
|
| - /// @param[in] addr address of breakpoint.
|
| - virtual Breakpoint* GetBreakpoint(void* addr);
|
| -
|
| - /// Return all breakpoints.
|
| - /// @param[out] breakpoints
|
| - virtual void GetBreakpoints(std::deque<Breakpoint*>* breakpoints);
|
| -
|
| - /// Converts relative pointer to flat(aka linear) process address.
|
| - /// Calling this function makes sense only for nexe threads,
|
| - /// it's safe to call for any thread.
|
| - /// @param[in] addr relative pointer
|
| - /// @return flat address
|
| - virtual void* FromNexeToFlatAddress(void* addr) const;
|
| -
|
| - protected:
|
| - friend class ExecutionEngine;
|
| -
|
| - /// Handler of debug events.
|
| - /// @param[in] debug_event debug event received from debuggee process
|
| - virtual void OnDebugEvent(DebugEvent* debug_event);
|
| -
|
| - /// Adds DebuggeeThread object with specified |id| and |handle|.
|
| - /// @param id thread id
|
| - /// @param handle handle to the thread object, should come from
|
| - /// CREATE_THREAD_DEBUG_EVENT or CREATE_PROCESS_DEBUG_EVENT debug events
|
| - /// Don't call ::CloseHandle on it, system releases it when thread is gone.
|
| - /// @return pointer to new thread object, DebuggeeProcess owns it.
|
| - /// Don't delete returned object.
|
| - /// If there's already thread with |id|, no new object is created,
|
| - /// pointer to existing one is returned.
|
| - virtual DebuggeeThread* AddThread(int id, HANDLE handle);
|
| -
|
| - virtual bool ContinueHaltedThread(DebuggeeThread::ContinueOption option);
|
| -
|
| - /// Removes DebuggeeThread object with specified |id|. System thread
|
| - /// structures are not affected.
|
| - /// Called by DebuggeeProcess when thread is gone.
|
| - /// @param id thread id
|
| - virtual void RemoveThread(int id);
|
| -
|
| - /// Delets all thread objects. System structures are not affected.
|
| - virtual void DeleteThreads();
|
| -
|
| - DebugAPI& debug_api_;
|
| - int id_;
|
| - HANDLE handle_;
|
| - HANDLE file_handle_;
|
| - State state_;
|
| - int exit_code_;
|
| - DebugEvent last_debug_event_;
|
| - std::deque<DebuggeeThread*> threads_;
|
| - std::map<void*, Breakpoint*> breakpoints_;
|
| - void* nexe_mem_base_;
|
| - void* nexe_entry_point_;
|
| -
|
| - private:
|
| - DebuggeeProcess(const DebuggeeProcess&); // DISALLOW_COPY_AND_ASSIGN
|
| - void operator=(const DebuggeeProcess&);
|
| -};
|
| -} // namespace debug
|
| -#endif // DEBUGGER_CORE_DEBUGGEE_PROCESS_H_
|
| -
|
|
|