Browse Source

Fixed Forum-6722: Added check for function expiration

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1302 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 20 years ago
parent
commit
1509c4d770
  1. 5
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs
  2. 12
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs
  3. 23
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs

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

@ -94,7 +94,10 @@ namespace Debugger @@ -94,7 +94,10 @@ namespace Debugger
Thread thread = debugger.GetThread(pThread);
Stepper stepper = thread.GetStepper(pStepper);
// There is a race condition: The tracking step out can be triggered after stepping step over
thread.CheckExpirationOfFunctions();
thread.Steppers.Remove(stepper);
stepper.OnStepComplete();
if (stepper.PauseWhenComplete) {

12
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs

@ -27,7 +27,7 @@ namespace Debugger @@ -27,7 +27,7 @@ namespace Debugger
Stepper stepOutStepper;
bool steppedOut;
bool steppedOut = false;
Thread thread;
uint chainIndex;
uint frameIndex;
@ -84,10 +84,13 @@ namespace Debugger @@ -84,10 +84,13 @@ namespace Debugger
/// </summary>
public event EventHandler Expired;
protected virtual void OnExpired(EventArgs e)
internal protected virtual void OnExpired(EventArgs e)
{
if (Expired != null) {
Expired(this, e);
if (!steppedOut) {
steppedOut = true;
if (Expired != null) {
Expired(this, e);
}
}
}
@ -122,7 +125,6 @@ namespace Debugger @@ -122,7 +125,6 @@ namespace Debugger
stepOutStepper.CorStepper.StepOut();
stepOutStepper.PauseWhenComplete = false;
stepOutStepper.StepComplete += delegate {
steppedOut = true;
OnExpired(EventArgs.Empty);
};
}

23
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs

@ -249,6 +249,29 @@ namespace Debugger @@ -249,6 +249,29 @@ namespace Debugger
return corFrameEnum.Next();
}
internal void CheckExpirationOfFunctions()
{
ICorDebugChainEnum corChainEnum = corThread.EnumerateChains();
uint maxChainIndex = corChainEnum.Count - 1;
ICorDebugFrameEnum corFrameEnum = corChainEnum.Next().EnumerateFrames();
uint maxFrameIndex = corFrameEnum.Count - 1;
List<Function> expiredFunctions = new List<Function>();
foreach(KeyValuePair<uint, Chain> chain in chainCache) {
if (chain.Key < maxChainIndex) continue;
foreach(KeyValuePair<uint, Function> func in chain.Value.Frames) {
if (chain.Key == maxChainIndex && func.Key <= maxFrameIndex) continue;
expiredFunctions.Add(func.Value);
}
}
foreach(Function f in expiredFunctions) {
f.OnExpired(EventArgs.Empty);
}
}
public Function SelectedFunction {
get {
return selectedFunction;

Loading…
Cancel
Save