blob: adb37402a3605a5fb399f78b643b576b00cdf763 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 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
*******************************************************************************/
#ifndef BREAKPOINTSERVICE_H_
#define BREAKPOINTSERVICE_H_
#include <map>
#include <string>
#include <vector>
#include "TCFService.h"
#include "TCFContext.h"
class WinProcess;
struct Channel;
struct Protocol;
enum TCFBreakpointType {
type_Auto,
type_Software,
type_Hardware
};
enum TCFAccessMode {
ACCESSMODE_READ = 0x01,
ACCESSMODE_WRITE = 0x02,
ACCESSMODE_EXECUTE = 0x04,
ACCESSMODE_CHANGE = 0x08,
};
typedef unsigned char HWBreakID;
#define HWBREAK_NOT_SET 0
//
// To store the breakpoint info
//
struct TBreakpoint {
std::vector<std::string> iContextIds;
WinProcess* process; // pointer to the process hosint the bkpt
std::string hostBreakPointId; // breakpoint ID from host debugger.
ContextAddress address;
bool enabled;
unsigned char originalByte; // original byte where we set the bp.
unsigned char size; // for windows-x86, max is well below 255
TCFBreakpointType bpType; // ignored; always software for bkpt
// and always hardware for watchpoint
TCFAccessMode accessMode; // _EXECUTE means bkpt; o/w -> watchpoint
HWBreakID hwBreakID;
TBreakpoint()
: process(NULL), address(0), enabled(true), originalByte(0),
size(0), bpType(type_Auto), accessMode(ACCESSMODE_READ),
hwBreakID(HWBREAK_NOT_SET)
{}
};
typedef std::map<std::string, TBreakpoint*> TID2BreakpointMap;
/*
* A list of breakpoints in all processes in the debug session.
*/
static TID2BreakpointMap sBreakPointMap;
//
// Breakpoint service implementation
//
class BreakpointsService: public TCFService {
public:
BreakpointsService(Protocol * proto);
const char* GetName();
static void CommandAddBreakpoint(const char* token, Channel*);
static void CommandRemoveBreakpoint(const char* token, Channel*);
static int InsertBreak(const TBreakpoint*);
static int ClearBreak(const TBreakpoint*);
static int InsertWatch(TBreakpoint*);
static int ClearWatch(TBreakpoint*);
static TBreakpoint* FindBreakpointByAddress(const HANDLE& processHandle,
const ContextAddress);
static TBreakpoint* FindWatchpointByAddress(const HANDLE& processHandle,
const ContextAddress);
static void RemoveBreakpointsFromMemoryRead(const HANDLE& processHandle,
const ContextAddress, char* memBuffer, const unsigned long size);
static void ReInsertBreakpointsAfterMemoryWrite(
const HANDLE& processHandle, const ContextAddress, char* memBuffer,
const unsigned long size);
static bool ServiceInstalled();
private:
static bool sServiceInstalled;
};
#endif /* BREAKPOINTSERVICE_H_ */