/******************************************************************************* | |
* Copyright (c) 2009 Nokia and others. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Contributors: | |
* Nokia - Initial API and implementation | |
*******************************************************************************/ | |
#pragma once | |
#include <string> | |
#include "stdafx.h" | |
#include "DebugMonitor.h" | |
#include "TCFChannel.h" | |
#include <queue> | |
extern "C" { | |
#include "channel.h" | |
#include "events.h" | |
} | |
class AgentAction; | |
class AgentActionParams; | |
class WinProcess; | |
/* | |
* Windows implementation of DebugMonitor. | |
*/ | |
class WinDebugMonitor: public DebugMonitor { | |
public: | |
WinDebugMonitor(const LaunchProcessParams& params); | |
WinDebugMonitor(const AttachToProcessParams& params); | |
virtual ~WinDebugMonitor(void); | |
void StartProcessForDebug(); | |
void EventLoop(); | |
void StartMonitor(); | |
void CaptureMonitorThread(); | |
void Suspend(); | |
void Resume(); | |
void PostAction(AgentAction* action); | |
virtual void Attach(unsigned long pid, ContextAttachCallBack * done, | |
void * data, int selfattach); | |
void StartDebug(); | |
/* | |
* Launch a process and monitor it. | |
*/ | |
static void LaunchProcess(const LaunchProcessParams& params) throw (AgentException); | |
/* | |
* Attach to a process and monitor it. | |
* processID: the Windows process ID. | |
*/ | |
static void AttachToProcess(const AttachToProcessParams& params) throw (AgentException); | |
static std::string GetDebugExceptionDescription(const EXCEPTION_DEBUG_INFO& exceptionInfo); | |
void HandleDebugEvent(DEBUG_EVENT& debugEvent); | |
void ProcessDied(DWORD process_id); | |
private: | |
void AttachToProcessForDebug(); | |
void HandleNoDebugEvent(); | |
void HandleExceptionEvent(DEBUG_EVENT& debugEvent); | |
void HandleProcessCreatedEvent(DEBUG_EVENT& debugEvent); | |
void HandleThreadCreatedEvent(DEBUG_EVENT& debugEvent); | |
void HandleProcessExitedEvent(DEBUG_EVENT& debugEvent); | |
void HandleThreadExitedEvent(DEBUG_EVENT& debugEvent); | |
void HandleDLLLoadedEvent(DEBUG_EVENT& debugEvent); | |
void HandleDLLUnloadedEvent(DEBUG_EVENT& debugEvent); | |
void HandleDebugStringEvent(DEBUG_EVENT& debugEvent); | |
void HandleSystemDebugErrorEvent(DEBUG_EVENT& debugEvent); | |
void HandleUnknwonDebugEvent(DEBUG_EVENT& debugEvent); | |
private: | |
DWORD wfdeWait; | |
bool waitForDebugEvents; | |
bool handledInitialDebugBreakpoint; | |
DWORD processID; | |
bool isAttach; | |
PROCESS_INFORMATION processInfo; | |
HANDLE monitorThread_; | |
std::queue<AgentAction*> actions_; | |
}; | |