Browse Source

Fixed Forum-8647(asl): Process post-break callbacks

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1537 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 19 years ago
parent
commit
f92065af79
  1. 1
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebuggerEvents/PausedReason.cs
  2. 43
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs
  3. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs

1
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebuggerEvents/PausedReason.cs

@ -15,6 +15,7 @@ namespace Debugger @@ -15,6 +15,7 @@ namespace Debugger
Break,
ControlCTrap,
Exception,
ForcedBreak, // Process.Break called
DebuggerError,
CurrentThreadChanged,
CurrentFunctionChanged,

43
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs

@ -23,6 +23,7 @@ namespace Debugger @@ -23,6 +23,7 @@ namespace Debugger
class ManagedCallback
{
NDebugger debugger;
bool pauseProcessInsteadOfContinue;
public NDebugger Debugger {
get {
@ -38,11 +39,27 @@ namespace Debugger @@ -38,11 +39,27 @@ namespace Debugger
void EnterCallback(PausedReason pausedReason, string name, ICorDebugProcess pProcess)
{
debugger.TraceMessage("Callback: " + name);
// ExitProcess may be called at any time when debuggee is killed
if (name != "ExitProcess") debugger.AssertRunning();
debugger.PauseSession = new PauseSession(pausedReason);
debugger.SelectedProcess = debugger.GetProcess(pProcess);
debugger.SelectedProcess.IsRunning = false;
// Check state
if (debugger.IsRunning ||
// After break is pressed we may receive some messages that were already queued
debugger.PauseSession.PausedReason == PausedReason.ForcedBreak ||
// ExitProcess may be called at any time when debuggee is killed
name == "ExitProcess") {
debugger.SelectedProcess = debugger.GetProcess(pProcess);
if (debugger.IsPaused && debugger.PauseSession.PausedReason == PausedReason.ForcedBreak) {
debugger.TraceMessage("Processing post-break callback");
// Continue the break, process is still breaked because of the callback
debugger.SelectedProcess.Continue();
pauseProcessInsteadOfContinue = true;
} else {
pauseProcessInsteadOfContinue = false;
}
debugger.SelectedProcess.IsRunning = false;
debugger.PauseSession = new PauseSession(pausedReason);
} else {
throw new DebuggerException("Invalid state at the start of callback");
}
}
void EnterCallback(PausedReason pausedReason, string name, ICorDebugAppDomain pAppDomain)
@ -52,19 +69,17 @@ namespace Debugger @@ -52,19 +69,17 @@ namespace Debugger
void EnterCallback(PausedReason pausedReason, string name, ICorDebugThread pThread)
{
debugger.TraceMessage("Callback: " + name);
// ExitProcess may be called at any time when debuggee is killed
if (name != "ExitProcess") debugger.AssertRunning();
Thread thread = debugger.GetThread(pThread);
debugger.PauseSession = new PauseSession(pausedReason);
debugger.SelectedProcess = thread.Process;
debugger.SelectedProcess.IsRunning = false;
debugger.SelectedProcess.SelectedThread = thread;
EnterCallback(pausedReason, name, pThread.Process);
debugger.SelectedProcess.SelectedThread = debugger.GetThread(pThread);
}
void ExitCallback_Continue()
{
debugger.SelectedProcess.Continue();
if (pauseProcessInsteadOfContinue) {
ExitCallback_Paused();
} else {
debugger.SelectedProcess.Continue();
}
}
void ExitCallback_Paused()

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs

@ -113,7 +113,7 @@ namespace Debugger @@ -113,7 +113,7 @@ namespace Debugger
corProcess.Stop(5000); // TODO: Hardcoded value
isProcessRunning = false;
debugger.PauseSession = new PauseSession(PausedReason.Break);
debugger.PauseSession = new PauseSession(PausedReason.ForcedBreak);
debugger.SelectedProcess = this;
if (this.SelectedThread == null && this.Threads.Count > 0) {

Loading…
Cancel
Save