mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 12:30:32 +00:00
56 lines
2.2 KiB
C#
56 lines
2.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using Cosmos.Debug.Common;
|
|
using Microsoft.VisualStudio.Debugger.Interop;
|
|
|
|
namespace Cosmos.Debug.VSDebugEngine {
|
|
// This class manages breakpoints for the engine.
|
|
public class BreakpointManager {
|
|
public const int MaxBP = 256;
|
|
protected AD7Engine mEngine;
|
|
protected DebugConnector mDbgConnector;
|
|
public List<AD7PendingBreakpoint> mPendingBPs = new List<AD7PendingBreakpoint>();
|
|
public AD7BoundBreakpoint[] mActiveBPs = new AD7BoundBreakpoint[MaxBP];
|
|
|
|
public BreakpointManager(AD7Engine aEngine) {
|
|
mEngine = aEngine;
|
|
}
|
|
|
|
public void SetDebugConnector(DebugConnector aConnector) {
|
|
mDbgConnector = aConnector;
|
|
}
|
|
|
|
// A helper method used to construct a new pending breakpoint.
|
|
public void CreatePendingBreakpoint(IDebugBreakpointRequest2 pBPRequest, out IDebugPendingBreakpoint2 ppPendingBP) {
|
|
var pendingBreakpoint = new AD7PendingBreakpoint(pBPRequest, mEngine, this);
|
|
ppPendingBP = (IDebugPendingBreakpoint2)pendingBreakpoint;
|
|
mPendingBPs.Add(pendingBreakpoint);
|
|
}
|
|
|
|
// Called from the engine's detach method to remove the debugger's breakpoint instructions.
|
|
public void ClearBoundBreakpoints() {
|
|
foreach (AD7PendingBreakpoint pendingBreakpoint in mPendingBPs) {
|
|
pendingBreakpoint.ClearBoundBreakpoints();
|
|
}
|
|
}
|
|
|
|
// Creates an entry and remotely enables the breakpoint in the debug stub
|
|
public int RemoteEnable(AD7BoundBreakpoint aBBP) {
|
|
for (int xID = 0; xID < MaxBP; xID++) {
|
|
if (mActiveBPs[xID] == null) {
|
|
mActiveBPs[xID] = aBBP;
|
|
mDbgConnector.SetBreakpoint(xID, aBBP.mAddress);
|
|
return xID;
|
|
}
|
|
}
|
|
throw new Exception("Maximum number of active breakpoints exceeded (" + MaxBP + ").");
|
|
}
|
|
|
|
public void RemoteDisable(AD7BoundBreakpoint aBBP) {
|
|
mActiveBPs[aBBP.RemoteID] = null;
|
|
mDbgConnector.DeleteBreakpoint(aBBP.RemoteID);
|
|
}
|
|
|
|
}
|
|
}
|