in src/csharp/MonoDebugSession.cs [53:155]
public MonoDebugSession() : base()
{
_variableHandles = new Handles<ObjectValue[]>();
_frameHandles = new Handles<Mono.Debugging.Client.StackFrame>();
_seenThreads = new Dictionary<int, Thread>();
_debuggerSessionOptions = new DebuggerSessionOptions {
EvaluationOptions = EvaluationOptions.DefaultOptions
};
_session = new Mono.Debugging.Soft.SoftDebuggerSession();
_session.Breakpoints = new BreakpointStore();
_breakpoints = new SortedDictionary<long, BreakEvent>();
_catchpoints = new List<Catchpoint>();
DebuggerLoggingService.CustomLogger = new CustomLogger();
_session.ExceptionHandler = ex => {
return true;
};
_session.LogWriter = (isStdErr, text) => {
};
_session.TargetStopped += (sender, e) => {
Stopped();
SendEvent(CreateStoppedEvent("step", e.Thread));
_resumeEvent.Set();
};
_session.TargetHitBreakpoint += (sender, e) => {
Stopped();
SendEvent(CreateStoppedEvent("breakpoint", e.Thread));
_resumeEvent.Set();
};
_session.TargetExceptionThrown += (sender, e) => {
Stopped();
var ex = DebuggerActiveException();
if (ex != null) {
_exception = ex.Instance;
SendEvent(CreateStoppedEvent("exception", e.Thread, ex.Message));
}
_resumeEvent.Set();
};
_session.TargetUnhandledException += (sender, e) => {
Stopped ();
var ex = DebuggerActiveException();
if (ex != null) {
_exception = ex.Instance;
SendEvent(CreateStoppedEvent("exception", e.Thread, ex.Message));
}
_resumeEvent.Set();
};
_session.TargetStarted += (sender, e) => {
_activeFrame = null;
};
_session.TargetReady += (sender, e) => {
_activeProcess = _session.GetProcesses().SingleOrDefault();
};
_session.TargetExited += (sender, e) => {
DebuggerKill();
_debuggeeKilled = true;
Terminate("target exited");
_resumeEvent.Set();
};
_session.TargetInterrupted += (sender, e) => {
_resumeEvent.Set();
};
_session.TargetEvent += (sender, e) => {
};
_session.TargetThreadStarted += (sender, e) => {
int tid = (int)e.Thread.Id;
lock (_seenThreads) {
_seenThreads[tid] = new Thread(tid, e.Thread.Name);
}
SendEvent(new ThreadEvent("started", tid));
};
_session.TargetThreadStopped += (sender, e) => {
int tid = (int)e.Thread.Id;
lock (_seenThreads) {
_seenThreads.Remove(tid);
}
SendEvent(new ThreadEvent("exited", tid));
};
_session.OutputWriter = (isStdErr, text) => {
SendOutput(isStdErr ? "stderr" : "stdout", text);
};
}