Browse Source

A few more checks that the process is alive before any callback is issued

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3216 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 18 years ago
parent
commit
78112c7a92
  1. 4
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs
  2. 6
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process-StateControl.cs
  3. 121
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallbackSwitch.cs

4
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Eval.cs

@ -120,6 +120,10 @@ namespace Debugger @@ -120,6 +120,10 @@ namespace Debugger
} else if ((uint)e.ErrorCode == 0x8013130A) {
// Happens on getting of Sytem.Threading.Thread.ManagedThreadId; See SD2-1116
throw new GetValueException("Function does not have IL code");
} else if ((uint)e.ErrorCode == 0x80131C23) {
// The operation failed because it is a GC unsafe point. (Exception from HRESULT: 0x80131C23)
// This can probably happen when we break and the thread is in native code
throw new GetValueException("Thread is in GC unsafe point");
} else {
throw;
}

6
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process-StateControl.cs

@ -14,10 +14,7 @@ namespace Debugger @@ -14,10 +14,7 @@ namespace Debugger
public partial class Process
{
// Order:
// Update PauseSession
// Update DebugSession
// Raise event
internal bool TerminateCommandIssued = false;
#region Events
@ -241,6 +238,7 @@ namespace Debugger @@ -241,6 +238,7 @@ namespace Debugger
// Stop&terminate - both must be called
corProcess.Stop(uint.MaxValue);
corProcess.Terminate(0);
this.TerminateCommandIssued = true;
// Do not mark the process as exited
// This is done once ExitProcess callback is received

121
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallbackSwitch.cs

@ -36,45 +36,70 @@ namespace Debugger @@ -36,45 +36,70 @@ namespace Debugger
this.debugger = debugger;
}
public ManagedCallback GetProcessCallbackInterface(ICorDebugController c)
public ManagedCallback GetProcessCallbackInterface(string name, ICorDebugController c)
{
if (c.Is<ICorDebugAppDomain>()) {
return GetProcessCallbackInterface(c.CastTo<ICorDebugAppDomain>());
return GetProcessCallbackInterface(name, c.CastTo<ICorDebugAppDomain>());
} else if (c.Is<ICorDebugProcess>()){
return GetProcessCallbackInterface(c.CastTo<ICorDebugProcess>());
return GetProcessCallbackInterface(name, c.CastTo<ICorDebugProcess>());
} else {
throw new System.Exception("Unknown callback argument");
}
}
public ManagedCallback GetProcessCallbackInterface(ICorDebugAppDomain pAppDomain)
public ManagedCallback GetProcessCallbackInterface(string name, ICorDebugThread pThread)
{
return GetProcessCallbackInterface(pAppDomain.Process);
ICorDebugProcess pProcess;
try {
pProcess = pThread.Process;
} catch (COMException e) {
debugger.TraceMessage("Ignoring callback \"" + name + "\": " + e.Message);
return null;
}
return GetProcessCallbackInterface(name, pProcess);
}
public ManagedCallback GetProcessCallbackInterface(string name, ICorDebugAppDomain pAppDomain)
{
ICorDebugProcess pProcess;
try {
pProcess = pAppDomain.Process;
} catch (COMException e) {
debugger.TraceMessage("Ignoring callback \"" + name + "\": " + e.Message);
return null;
}
return GetProcessCallbackInterface(name, pProcess);
}
public ManagedCallback GetProcessCallbackInterface(ICorDebugProcess pProcess)
public ManagedCallback GetProcessCallbackInterface(string name, ICorDebugProcess pProcess)
{
Process process = debugger.GetProcess(pProcess);
if (process == null || process.HasExited) {
debugger.TraceMessage("Ignoring callback of exited process (process not found)");
// Make *really* sure the process is not dead
if (process == null) {
debugger.TraceMessage("Ignoring callback \"" + name + "\": Process not found");
return null;
}
if (process.HasExited) {
debugger.TraceMessage("Ignoring callback \"" + name + "\": Process has exited");
return null;
}
if (process.TerminateCommandIssued && !(name == "ExitProcess")) {
debugger.TraceMessage("Ignoring callback \"" + name + "\": Terminate command was issued for the process");
return null;
}
// Check that the process is not exited
try {
int isRunning = process.CorProcess.IsRunning;
} catch (COMException e) {
// 0x80131301: Process was terminated
if ((uint)e.ErrorCode == 0x80131301) {
process.TraceMessage("Ignoring callback of exited process (check failed)");
return null;
}
process.TraceMessage("Ignoring callback \"" + name + "\": " + e.Message);
return null;
}
return process.CallbackInterface;
}
public void ExitProcess(ICorDebugProcess pProcess)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
ManagedCallback managedCallback = GetProcessCallbackInterface("ExitProcess", pProcess);
if (managedCallback != null) {
managedCallback.ExitProcess(pProcess);
}
@ -84,7 +109,7 @@ namespace Debugger @@ -84,7 +109,7 @@ namespace Debugger
public void StepComplete(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugStepper pStepper, CorDebugStepReason reason)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("StepComplete", pAppDomain);
if (managedCallback != null) {
managedCallback.StepComplete(pAppDomain, pThread, pStepper, reason);
}
@ -93,7 +118,7 @@ namespace Debugger @@ -93,7 +118,7 @@ namespace Debugger
// Do not pass the pBreakpoint parameter as ICorDebugBreakpoint - marshaling of it fails in .NET 1.1
public void Breakpoint(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugBreakpoint pBreakpoint)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("Breakpoint", pAppDomain);
if (managedCallback != null) {
managedCallback.Breakpoint(pAppDomain, pThread, pBreakpoint);
}
@ -101,7 +126,7 @@ namespace Debugger @@ -101,7 +126,7 @@ namespace Debugger
public void BreakpointSetError(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugBreakpoint pBreakpoint, uint dwError)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("BreakpointSetError", pAppDomain);
if (managedCallback != null) {
managedCallback.BreakpointSetError(pAppDomain, pThread, pBreakpoint, dwError);
}
@ -109,7 +134,7 @@ namespace Debugger @@ -109,7 +134,7 @@ namespace Debugger
public unsafe void Break(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("Break", pAppDomain);
if (managedCallback != null) {
managedCallback.Break(pAppDomain, pThread);
}
@ -117,7 +142,7 @@ namespace Debugger @@ -117,7 +142,7 @@ namespace Debugger
public void ControlCTrap(ICorDebugProcess pProcess)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
ManagedCallback managedCallback = GetProcessCallbackInterface("ControlCTrap", pProcess);
if (managedCallback != null) {
managedCallback.ControlCTrap(pProcess);
}
@ -125,7 +150,7 @@ namespace Debugger @@ -125,7 +150,7 @@ namespace Debugger
public unsafe void Exception(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int unhandled)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("Exception", pAppDomain);
if (managedCallback != null) {
managedCallback.Exception(pAppDomain, pThread, unhandled);
}
@ -137,7 +162,7 @@ namespace Debugger @@ -137,7 +162,7 @@ namespace Debugger
public void LogSwitch(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int lLevel, uint ulReason, string pLogSwitchName, string pParentName)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("LogSwitch", pAppDomain);
if (managedCallback != null) {
managedCallback.LogSwitch(pAppDomain, pThread, lLevel, ulReason, pLogSwitchName, pParentName);
}
@ -145,7 +170,7 @@ namespace Debugger @@ -145,7 +170,7 @@ namespace Debugger
public void LogMessage(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int lLevel, string pLogSwitchName, string pMessage)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("LogMessage", pAppDomain);
if (managedCallback != null) {
managedCallback.LogMessage(pAppDomain, pThread, lLevel, pLogSwitchName, pMessage);
}
@ -153,7 +178,7 @@ namespace Debugger @@ -153,7 +178,7 @@ namespace Debugger
public void EditAndContinueRemap(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFunction pFunction, int fAccurate)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("EditAndContinueRemap", pAppDomain);
if (managedCallback != null) {
managedCallback.EditAndContinueRemap(pAppDomain, pThread, pFunction, fAccurate);
}
@ -161,7 +186,7 @@ namespace Debugger @@ -161,7 +186,7 @@ namespace Debugger
public void EvalException(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugEval corEval)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("EvalException", pAppDomain);
if (managedCallback != null) {
managedCallback.EvalException(pAppDomain, pThread, corEval);
}
@ -169,7 +194,7 @@ namespace Debugger @@ -169,7 +194,7 @@ namespace Debugger
public void EvalComplete(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugEval corEval)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("EvalComplete", pAppDomain);
if (managedCallback != null) {
managedCallback.EvalComplete(pAppDomain, pThread, corEval);
}
@ -177,7 +202,7 @@ namespace Debugger @@ -177,7 +202,7 @@ namespace Debugger
public void DebuggerError(ICorDebugProcess pProcess, int errorHR, uint errorCode)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
ManagedCallback managedCallback = GetProcessCallbackInterface("DebuggerError", pProcess);
if (managedCallback != null) {
managedCallback.DebuggerError(pProcess, errorHR, errorCode);
}
@ -185,7 +210,7 @@ namespace Debugger @@ -185,7 +210,7 @@ namespace Debugger
public void UpdateModuleSymbols(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule, IStream pSymbolStream)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("UpdateModuleSymbols", pAppDomain);
if (managedCallback != null) {
managedCallback.UpdateModuleSymbols(pAppDomain, pModule, pSymbolStream);
}
@ -197,7 +222,7 @@ namespace Debugger @@ -197,7 +222,7 @@ namespace Debugger
public void CreateProcess(ICorDebugProcess pProcess)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
ManagedCallback managedCallback = GetProcessCallbackInterface("CreateProcess", pProcess);
if (managedCallback != null) {
managedCallback.CreateProcess(pProcess);
}
@ -205,7 +230,7 @@ namespace Debugger @@ -205,7 +230,7 @@ namespace Debugger
public void CreateAppDomain(ICorDebugProcess pProcess, ICorDebugAppDomain pAppDomain)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
ManagedCallback managedCallback = GetProcessCallbackInterface("CreateAppDomain", pProcess);
if (managedCallback != null) {
managedCallback.CreateAppDomain(pProcess, pAppDomain);
}
@ -213,7 +238,7 @@ namespace Debugger @@ -213,7 +238,7 @@ namespace Debugger
public void LoadAssembly(ICorDebugAppDomain pAppDomain, ICorDebugAssembly pAssembly)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("LoadAssembly", pAppDomain);
if (managedCallback != null) {
managedCallback.LoadAssembly(pAppDomain, pAssembly);
}
@ -221,7 +246,7 @@ namespace Debugger @@ -221,7 +246,7 @@ namespace Debugger
public unsafe void LoadModule(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("LoadModule", pAppDomain);
if (managedCallback != null) {
managedCallback.LoadModule(pAppDomain, pModule);
}
@ -231,10 +256,10 @@ namespace Debugger @@ -231,10 +256,10 @@ namespace Debugger
{
ManagedCallback managedCallback = null;
if (pAppDomain != null) {
managedCallback = GetProcessCallbackInterface(pAppDomain);
managedCallback = GetProcessCallbackInterface("NameChange", pAppDomain);
}
if (pThread != null) {
managedCallback = GetProcessCallbackInterface(pThread.Process);
managedCallback = GetProcessCallbackInterface("NameChange", pThread);
}
if (managedCallback != null) {
managedCallback.NameChange(pAppDomain, pThread);
@ -243,7 +268,7 @@ namespace Debugger @@ -243,7 +268,7 @@ namespace Debugger
public void CreateThread(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("CreateThread", pAppDomain);
if (managedCallback != null) {
managedCallback.CreateThread(pAppDomain, pThread);
}
@ -251,7 +276,7 @@ namespace Debugger @@ -251,7 +276,7 @@ namespace Debugger
public void LoadClass(ICorDebugAppDomain pAppDomain, ICorDebugClass c)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("LoadClass", pAppDomain);
if (managedCallback != null) {
managedCallback.LoadClass(pAppDomain, c);
}
@ -263,7 +288,7 @@ namespace Debugger @@ -263,7 +288,7 @@ namespace Debugger
public void UnloadClass(ICorDebugAppDomain pAppDomain, ICorDebugClass c)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("UnloadClass", pAppDomain);
if (managedCallback != null) {
managedCallback.UnloadClass(pAppDomain, c);
}
@ -271,7 +296,7 @@ namespace Debugger @@ -271,7 +296,7 @@ namespace Debugger
public void UnloadModule(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("UnloadModule", pAppDomain);
if (managedCallback != null) {
managedCallback.UnloadModule(pAppDomain, pModule);
}
@ -279,7 +304,7 @@ namespace Debugger @@ -279,7 +304,7 @@ namespace Debugger
public void UnloadAssembly(ICorDebugAppDomain pAppDomain, ICorDebugAssembly pAssembly)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("UnloadAssembly", pAppDomain);
if (managedCallback != null) {
managedCallback.UnloadAssembly(pAppDomain, pAssembly);
}
@ -287,7 +312,7 @@ namespace Debugger @@ -287,7 +312,7 @@ namespace Debugger
public void ExitThread(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("ExitThread", pAppDomain);
if (managedCallback != null) {
managedCallback.ExitThread(pAppDomain, pThread);
}
@ -295,7 +320,7 @@ namespace Debugger @@ -295,7 +320,7 @@ namespace Debugger
public void ExitAppDomain(ICorDebugProcess pProcess, ICorDebugAppDomain pAppDomain)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
ManagedCallback managedCallback = GetProcessCallbackInterface("ExitAppDomain", pProcess);
if (managedCallback != null) {
managedCallback.ExitAppDomain(pProcess, pAppDomain);
}
@ -307,7 +332,7 @@ namespace Debugger @@ -307,7 +332,7 @@ namespace Debugger
public void ChangeConnection(ICorDebugProcess pProcess, uint dwConnectionId)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
ManagedCallback managedCallback = GetProcessCallbackInterface("ChangeConnection", pProcess);
if (managedCallback != null) {
managedCallback.ChangeConnection(pProcess, dwConnectionId);
}
@ -315,7 +340,7 @@ namespace Debugger @@ -315,7 +340,7 @@ namespace Debugger
public void CreateConnection(ICorDebugProcess pProcess, uint dwConnectionId, IntPtr pConnName)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
ManagedCallback managedCallback = GetProcessCallbackInterface("CreateConnection", pProcess);
if (managedCallback != null) {
managedCallback.CreateConnection(pProcess, dwConnectionId, pConnName);
}
@ -323,7 +348,7 @@ namespace Debugger @@ -323,7 +348,7 @@ namespace Debugger
public void DestroyConnection(ICorDebugProcess pProcess, uint dwConnectionId)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
ManagedCallback managedCallback = GetProcessCallbackInterface("DestroyConnection", pProcess);
if (managedCallback != null) {
managedCallback.DestroyConnection(pProcess, dwConnectionId);
}
@ -331,7 +356,7 @@ namespace Debugger @@ -331,7 +356,7 @@ namespace Debugger
public void Exception2(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFrame pFrame, uint nOffset, CorDebugExceptionCallbackType exceptionType, uint dwFlags)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("Exception2", pAppDomain);
if (managedCallback != null) {
managedCallback.Exception2(pAppDomain, pThread, pFrame, nOffset, exceptionType, dwFlags);
}
@ -339,7 +364,7 @@ namespace Debugger @@ -339,7 +364,7 @@ namespace Debugger
public void ExceptionUnwind(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, CorDebugExceptionUnwindCallbackType dwEventType, uint dwFlags)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("ExceptionUnwind", pAppDomain);
if (managedCallback != null) {
managedCallback.ExceptionUnwind(pAppDomain, pThread, dwEventType, dwFlags);
}
@ -347,7 +372,7 @@ namespace Debugger @@ -347,7 +372,7 @@ namespace Debugger
public void FunctionRemapComplete(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFunction pFunction)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("FunctionRemapComplete", pAppDomain);
if (managedCallback != null) {
managedCallback.FunctionRemapComplete(pAppDomain, pThread, pFunction);
}
@ -355,7 +380,7 @@ namespace Debugger @@ -355,7 +380,7 @@ namespace Debugger
public void FunctionRemapOpportunity(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFunction pOldFunction, ICorDebugFunction pNewFunction, uint oldILOffset)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(pAppDomain);
ManagedCallback managedCallback = GetProcessCallbackInterface("FunctionRemapOpportunity", pAppDomain);
if (managedCallback != null) {
managedCallback.FunctionRemapOpportunity(pAppDomain, pThread, pOldFunction, pNewFunction, oldILOffset);
}
@ -363,7 +388,7 @@ namespace Debugger @@ -363,7 +388,7 @@ namespace Debugger
public void MDANotification(ICorDebugController c, ICorDebugThread t, ICorDebugMDA mda)
{
ManagedCallback managedCallback = GetProcessCallbackInterface(c);
ManagedCallback managedCallback = GetProcessCallbackInterface("MDANotification", c);
if (managedCallback != null) {
managedCallback.MDANotification(c, t, mda);
}

Loading…
Cancel
Save