pascalabcnet/Debugger.Core/Src/Debugger/Internal/ManagedCallbackSwitch.cs
Бондарев Иван e6e67c193c initial commit
2015-05-14 21:35:07 +02:00

372 lines
12 KiB
C#

// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
// <version>$Revision: 1965 $</version>
// </file>
// Regular expresion:
// ^{\t*}{(:Ll| )*{:i} *\(((.# {:i}, |\))|())^6\)*}\n\t*\{(.|\n)@^\1\}
// Output: \1 - intention \2 - declaration \3 - function name \4-9 parameters
// Replace with:
// \1\2\n\1{\n\1\tGetProcessCallbackInterface(\4).\3(\4, \5, \6, \7, \8, \9);\n\1}
using System;
using System.Runtime.InteropServices;
using Debugger.Wrappers.CorDebug;
namespace Debugger
{
/// <summary>
/// This class forwards the callback the the approprite process
/// </summary>
class ManagedCallbackSwitch
{
NDebugger debugger;
public NDebugger Debugger {
get {
return debugger;
}
}
public ManagedCallbackSwitch(NDebugger debugger)
{
this.debugger = debugger;
}
public ManagedCallback GetProcessCallbackInterface(ICorDebugController c)
{
if (c.Is<ICorDebugAppDomain>()) {
return GetProcessCallbackInterface(c.CastTo<ICorDebugAppDomain>());
} else if (c.Is<ICorDebugProcess>()){
return GetProcessCallbackInterface(c.CastTo<ICorDebugProcess>());
} else {
throw new System.Exception("Unknown callback argument");
}
}
public ManagedCallback GetProcessCallbackInterface(ICorDebugAppDomain pAppDomain)
{
return GetProcessCallbackInterface(pAppDomain.Process);
}
public ManagedCallback GetProcessCallbackInterface(ICorDebugProcess pProcess)
{
Process process = debugger.GetProcess(pProcess);
if (process == null)
return null;
try {
int isRunning = process.CorProcess.IsRunning;
} catch (COMException e) {
// 0x80131301: Process was terminated
if ((uint)e.ErrorCode == 0x80131301) {
process.TraceMessage("Ingoring callback of exited process");
return null;
}
}
return process.CallbackInterface;
}
#region Program folow control
public void StepComplete(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugStepper pStepper, CorDebugStepReason reason)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.StepComplete(pAppDomain, pThread, pStepper, reason);
}
}
// Do not pass the pBreakpoint parameter as ICorDebugBreakpoint - marshaling of it fails in .NET 1.1
public void Breakpoint(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, IntPtr pBreakpoint)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.Breakpoint(pAppDomain, pThread, pBreakpoint);
}
}
public void BreakpointSetError(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugBreakpoint pBreakpoint, uint dwError)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.BreakpointSetError(pAppDomain, pThread, pBreakpoint, dwError);
}
}
public unsafe void Break(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.Break(pAppDomain, pThread);
}
}
public void ControlCTrap(ICorDebugProcess pProcess)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
if (managedCallback != null) {
managedCallback.ControlCTrap(pProcess);
}
}
public unsafe void Exception(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int unhandled)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.Exception(pAppDomain, pThread, unhandled);
}
}
#endregion
#region Various
public void LogSwitch(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int lLevel, uint ulReason, string pLogSwitchName, string pParentName)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.LogSwitch(pAppDomain, pThread, lLevel, ulReason, pLogSwitchName, pParentName);
}
}
public void LogMessage(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int lLevel, string pLogSwitchName, string pMessage)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.LogMessage(pAppDomain, pThread, lLevel, pLogSwitchName, pMessage);
}
}
public void EditAndContinueRemap(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFunction pFunction, int fAccurate)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.EditAndContinueRemap(pAppDomain, pThread, pFunction, fAccurate);
}
}
public void EvalException(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugEval corEval)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.EvalException(pAppDomain, pThread, corEval);
}
}
public void EvalComplete(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugEval corEval)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.EvalComplete(pAppDomain, pThread, corEval);
}
}
public void DebuggerError(ICorDebugProcess pProcess, int errorHR, uint errorCode)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
if (managedCallback != null) {
managedCallback.DebuggerError(pProcess, errorHR, errorCode);
}
}
public void UpdateModuleSymbols(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule, IStream pSymbolStream)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.UpdateModuleSymbols(pAppDomain, pModule, pSymbolStream);
}
}
#endregion
#region Start of Application
public void CreateProcess(ICorDebugProcess pProcess)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
if (managedCallback != null) {
managedCallback.CreateProcess(pProcess);
}
}
public void CreateAppDomain(ICorDebugProcess pProcess, ICorDebugAppDomain pAppDomain)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
if (managedCallback != null) {
managedCallback.CreateAppDomain(pProcess, pAppDomain);
}
}
public void LoadAssembly(ICorDebugAppDomain pAppDomain, ICorDebugAssembly pAssembly)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.LoadAssembly(pAppDomain, pAssembly);
}
}
public unsafe void LoadModule(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.LoadModule(pAppDomain, pModule);
}
}
public void NameChange(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread)
{
ManagedCallback managedCallback = null;
if (pAppDomain != null) {
managedCallback = GetProcessCallbackInterface(pAppDomain);
}
if (pThread != null) {
managedCallback = GetProcessCallbackInterface(pThread.Process);
}
if (managedCallback != null) {
managedCallback.NameChange(pAppDomain, pThread);
}
}
public void CreateThread(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.CreateThread(pAppDomain, pThread);
}
}
public void LoadClass(ICorDebugAppDomain pAppDomain, ICorDebugClass c)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.LoadClass(pAppDomain, c);
}
}
#endregion
#region Exit of Application
public void UnloadClass(ICorDebugAppDomain pAppDomain, ICorDebugClass c)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.UnloadClass(pAppDomain, c);
}
}
public void UnloadModule(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.UnloadModule(pAppDomain, pModule);
}
}
public void UnloadAssembly(ICorDebugAppDomain pAppDomain, ICorDebugAssembly pAssembly)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.UnloadAssembly(pAppDomain, pAssembly);
}
}
public void ExitThread(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.ExitThread(pAppDomain, pThread);
}
}
public void ExitAppDomain(ICorDebugProcess pProcess, ICorDebugAppDomain pAppDomain)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
if (managedCallback != null) {
managedCallback.ExitAppDomain(pProcess, pAppDomain);
}
}
public void ExitProcess(ICorDebugProcess pProcess)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
if (managedCallback != null) {
managedCallback.ExitProcess(pProcess);
}
}
#endregion
#region ICorDebugManagedCallback2 Members
public void ChangeConnection(ICorDebugProcess pProcess, uint dwConnectionId)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
if (managedCallback != null) {
managedCallback.ChangeConnection(pProcess, dwConnectionId);
}
}
public void CreateConnection(ICorDebugProcess pProcess, uint dwConnectionId, IntPtr pConnName)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
if (managedCallback != null) {
managedCallback.CreateConnection(pProcess, dwConnectionId, pConnName);
}
}
public void DestroyConnection(ICorDebugProcess pProcess, uint dwConnectionId)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
if (managedCallback != null) {
managedCallback.DestroyConnection(pProcess, dwConnectionId);
}
}
public void Exception2(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFrame pFrame, uint nOffset, CorDebugExceptionCallbackType exceptionType, uint dwFlags)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.Exception2(pAppDomain, pThread, pFrame, nOffset, exceptionType, dwFlags);
}
}
public void ExceptionUnwind(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, CorDebugExceptionUnwindCallbackType dwEventType, uint dwFlags)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.ExceptionUnwind(pAppDomain, pThread, dwEventType, dwFlags);
}
}
public void FunctionRemapComplete(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFunction pFunction)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.FunctionRemapComplete(pAppDomain, pThread, pFunction);
}
}
public void FunctionRemapOpportunity(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFunction pOldFunction, ICorDebugFunction pNewFunction, uint oldILOffset)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
if (managedCallback != null) {
managedCallback.FunctionRemapOpportunity(pAppDomain, pThread, pOldFunction, pNewFunction, oldILOffset);
}
}
public void MDANotification(ICorDebugController c, ICorDebugThread t, ICorDebugMDA mda)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(c);
if (managedCallback != null) {
managedCallback.MDANotification(c, t, mda);
}
}
#endregion
}
}