Browse Source

Changed semantics of Process.Terminate: The process is not immediately marked as exited; It is marked as exited when the callback is received.

Added tests for process termination.  
Tracking of COM objects is no longer outputted to the console.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3132 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 17 years ago
parent
commit
2545154105
  1. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/NDebugger-Processes.cs
  2. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/NDebugger.cs
  3. 6
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process-StateControl.cs
  4. 1
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process.cs
  5. 1
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs
  6. 12
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallbackSwitch.cs
  7. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/ResourceManager.cs
  8. 2
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj
  9. 8
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTestsBase.cs
  10. 7
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/MainThreadExit.cs
  11. 57
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/TerminatePausedProcess.cs
  12. 54
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/TerminateRunningProcess.cs

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/NDebugger-Processes.cs

@ -33,7 +33,7 @@ namespace Debugger
return process; return process;
} }
} }
throw new DebuggerException("Process is not in collection"); return null;
} }
internal void AddProcess(Process process) internal void AddProcess(Process process)

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/NDebugger.cs

@ -119,9 +119,7 @@ namespace Debugger
TraceMessage("ICorDebug terminated"); TraceMessage("ICorDebug terminated");
Wrappers.ResourceManager.TraceMessagesEnabled = true;
Wrappers.ResourceManager.ReleaseAllTrackedCOMObjects(); Wrappers.ResourceManager.ReleaseAllTrackedCOMObjects();
Wrappers.ResourceManager.TraceMessagesEnabled = false;
TraceMessage("Tracked COM objects released"); TraceMessage("Tracked COM objects released");
} }

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

@ -220,6 +220,9 @@ namespace Debugger
corProcess.Continue(0); corProcess.Continue(0);
} }
/// <summary> Terminates the execution of the process </summary>
/// <remarks> The process does not terminate immediately
/// after the call </remarks>
public void Terminate() public void Terminate()
{ {
// Resume stoped tread // Resume stoped tread
@ -235,7 +238,8 @@ namespace Debugger
corProcess.Stop(uint.MaxValue); corProcess.Stop(uint.MaxValue);
corProcess.Terminate(0); corProcess.Terminate(0);
this.NotifyHasExpired(); // Just give the command and continue without marking the process as
// exited. We will get ExitProcess callback soon
} }
void SelectSomeThread() void SelectSomeThread()

1
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process.cs

@ -45,6 +45,7 @@ namespace Debugger
if (DebuggeeState != null) { if (DebuggeeState != null) {
ExpireDebuggeeState(); ExpireDebuggeeState();
} }
debugger.RemoveProcess(this);
} }
} }

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

@ -431,7 +431,6 @@ namespace Debugger
process.TraceMessage("Callback: ExitProcess"); process.TraceMessage("Callback: ExitProcess");
process.NotifyHasExpired(); process.NotifyHasExpired();
process.Debugger.RemoveProcess(process);
} }
#endregion #endregion

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

@ -55,15 +55,17 @@ namespace Debugger
public ManagedCallback GetProcessCallbackInterface(ICorDebugProcess pProcess) public ManagedCallback GetProcessCallbackInterface(ICorDebugProcess pProcess)
{ {
Process process = debugger.GetProcess(pProcess); Process process = debugger.GetProcess(pProcess);
if (process.HasExpired) { if (process == null || process.HasExpired) {
debugger.TraceMessage("Ignoring callback of exited process (process not found)");
return null; return null;
} }
// Check that the process is not exited
try { try {
int isRunning = process.CorProcess.IsRunning; int isRunning = process.CorProcess.IsRunning;
} catch (COMException e) { } catch (COMException e) {
// 0x80131301: Process was terminated // 0x80131301: Process was terminated
if ((uint)e.ErrorCode == 0x80131301) { if ((uint)e.ErrorCode == 0x80131301) {
process.TraceMessage("Ingoring callback of exited process"); process.TraceMessage("Ignoring callback of exited process (check failed)");
return null; return null;
} }
} }
@ -72,8 +74,10 @@ namespace Debugger
public void ExitProcess(ICorDebugProcess pProcess) public void ExitProcess(ICorDebugProcess pProcess)
{ {
ManagedCallback managedCallback = debugger.GetProcess(pProcess).CallbackInterface; ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
managedCallback.ExitProcess(pProcess); if (managedCallback != null) {
managedCallback.ExitProcess(pProcess);
}
} }
#region Program folow control #region Program folow control

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/ResourceManager.cs

@ -30,7 +30,7 @@ namespace Debugger.Wrappers
public static class ResourceManager public static class ResourceManager
{ {
static MTA2STA mta2sta = new MTA2STA(); static MTA2STA mta2sta = new MTA2STA();
static bool trace = true; static bool trace = false;
static Dictionary<object, TrackedObjectMetaData> trackedCOMObjects = new Dictionary<object, TrackedObjectMetaData>(); static Dictionary<object, TrackedObjectMetaData> trackedCOMObjects = new Dictionary<object, TrackedObjectMetaData>();
public static bool TraceMessagesEnabled { public static bool TraceMessagesEnabled {

2
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj

@ -69,6 +69,8 @@
<Compile Include="Src\TestPrograms\StackOverflow.cs" /> <Compile Include="Src\TestPrograms\StackOverflow.cs" />
<Compile Include="Src\TestPrograms\Stepping.cs" /> <Compile Include="Src\TestPrograms\Stepping.cs" />
<Compile Include="Src\TestPrograms\Symbols.cs" /> <Compile Include="Src\TestPrograms\Symbols.cs" />
<Compile Include="Src\TestPrograms\TerminatePausedProcess.cs" />
<Compile Include="Src\TestPrograms\TerminateRunningProcess.cs" />
<Compile Include="Src\TestPrograms\ValueType.cs" /> <Compile Include="Src\TestPrograms\ValueType.cs" />
<Compile Include="Src\TestPrograms\_Template.cs" /> <Compile Include="Src\TestPrograms\_Template.cs" />
<EmbeddedResource Include="Src\TestPrograms\*.xml" /> <EmbeddedResource Include="Src\TestPrograms\*.xml" />

8
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTestsBase.cs

@ -78,7 +78,7 @@ namespace Debugger.Tests
CheckXmlOutput(); CheckXmlOutput();
} }
void CheckXmlOutput() protected void CheckXmlOutput()
{ {
string startMark = "#if EXPECTED_OUTPUT\r\n"; string startMark = "#if EXPECTED_OUTPUT\r\n";
string endMark = "#endif // EXPECTED_OUTPUT"; string endMark = "#endif // EXPECTED_OUTPUT";
@ -307,12 +307,16 @@ namespace Debugger.Tests
string path = Path.GetTempPath(); string path = Path.GetTempPath();
path = Path.Combine(path, "SharpDevelop"); path = Path.Combine(path, "SharpDevelop");
path = Path.Combine(path, "DebuggerTests"); path = Path.Combine(path, "DebuggerTests");
path = Path.Combine(path, md5); path = Path.Combine(path, testName + "." + md5);
Directory.CreateDirectory(path); Directory.CreateDirectory(path);
string codeFilename = Path.Combine(path, testName); string codeFilename = Path.Combine(path, testName);
string exeFilename = Path.Combine(path, testName.Replace(".cs", ".exe")); string exeFilename = Path.Combine(path, testName.Replace(".cs", ".exe"));
if (File.Exists(exeFilename)) {
return exeFilename;
}
StreamWriter file = new StreamWriter(codeFilename); StreamWriter file = new StreamWriter(codeFilename);
file.Write(code); file.Write(code);
file.Close(); file.Close();

7
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/MainThreadExit.cs

@ -19,6 +19,7 @@ namespace Debugger.Tests.TestPrograms
System.Threading.Thread t = new System.Threading.Thread(WaitForALongTime); System.Threading.Thread t = new System.Threading.Thread(WaitForALongTime);
t.Name = "Worker thread"; t.Name = "Worker thread";
t.Start(); t.Start();
System.Threading.Thread.Sleep(0);
System.Diagnostics.Debugger.Break(); System.Diagnostics.Debugger.Break();
} }
@ -82,11 +83,11 @@ namespace Debugger.Tests {
<CurrentExceptionIsUnhandled>False</CurrentExceptionIsUnhandled> <CurrentExceptionIsUnhandled>False</CurrentExceptionIsUnhandled>
<CurrentExceptionType>0</CurrentExceptionType> <CurrentExceptionType>0</CurrentExceptionType>
<HasExited>False</HasExited> <HasExited>False</HasExited>
<IsAtSafePoint>False</IsAtSafePoint> <IsAtSafePoint>True</IsAtSafePoint>
<IsInValidState>True</IsInValidState> <IsInValidState>True</IsInValidState>
<IsMostRecentStackFrameNative>False</IsMostRecentStackFrameNative> <IsMostRecentStackFrameNative>False</IsMostRecentStackFrameNative>
<MostRecentStackFrame>System.Threading.ThreadHelper.ThreadStart</MostRecentStackFrame> <MostRecentStackFrame>System.Threading.WaitHandle.WaitOne</MostRecentStackFrame>
<MostRecentStackFrameWithLoadedSymbols>null</MostRecentStackFrameWithLoadedSymbols> <MostRecentStackFrameWithLoadedSymbols>Debugger.Tests.TestPrograms.MainThreadExit.WaitForALongTime</MostRecentStackFrameWithLoadedSymbols>
<Name>Worker thread</Name> <Name>Worker thread</Name>
<OldestStackFrame>System.Threading.ThreadHelper.ThreadStart</OldestStackFrame> <OldestStackFrame>System.Threading.ThreadHelper.ThreadStart</OldestStackFrame>
<Priority>Normal</Priority> <Priority>Normal</Priority>

57
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/TerminatePausedProcess.cs

@ -0,0 +1,57 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
// <version>$Revision$</version>
// </file>
using System;
namespace Debugger.Tests.TestPrograms
{
public class TerminatePausedProcess
{
public static void Main()
{
System.Diagnostics.Debugger.Break();
}
}
}
#if TEST_CODE
namespace Debugger.Tests {
public partial class DebuggerTests
{
[NUnit.Framework.Test]
public void TerminatePausedProcess()
{
StartTest("TerminatePausedProcess.cs");
process.Terminate();
process.WaitForExit();
StartTest("TerminatePausedProcess.cs");
process.Terminate();
process.WaitForExit();
CheckXmlOutput();
}
}
}
#endif
#if EXPECTED_OUTPUT
<?xml version="1.0" encoding="utf-8"?>
<DebuggerTests>
<Test name="TerminatePausedProcess.cs">
<ProcessStarted />
<ModuleLoaded symbols="False">mscorlib.dll</ModuleLoaded>
<ModuleLoaded symbols="True">TerminatePausedProcess.exe</ModuleLoaded>
<DebuggingPaused>Break</DebuggingPaused>
<ProcessExited />
<ProcessStarted />
<ModuleLoaded symbols="False">mscorlib.dll</ModuleLoaded>
<ModuleLoaded symbols="True">TerminatePausedProcess.exe</ModuleLoaded>
<DebuggingPaused>Break</DebuggingPaused>
<ProcessExited />
</Test>
</DebuggerTests>
#endif // EXPECTED_OUTPUT

54
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/TerminateRunningProcess.cs

@ -0,0 +1,54 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Threading;
namespace Debugger.Tests.TestPrograms
{
public class TerminateRunningProcess
{
static ManualResetEvent doSomething = new ManualResetEvent(false);
public static void Main()
{
doSomething.WaitOne();
}
}
}
#if TEST_CODE
namespace Debugger.Tests {
public partial class DebuggerTests
{
[NUnit.Framework.Test]
public void TerminateRunningProcess()
{
StartTest("TerminateRunningProcess.cs", false);
process.Terminate();
process.WaitForExit();
StartTest("TerminateRunningProcess.cs", false);
process.Terminate();
process.WaitForExit();
CheckXmlOutput();
}
}
}
#endif
#if EXPECTED_OUTPUT
<?xml version="1.0" encoding="utf-8"?>
<DebuggerTests>
<Test name="TerminateRunningProcess.cs">
<ProcessStarted />
<ProcessExited />
<ProcessStarted />
<ProcessExited />
</Test>
</DebuggerTests>
#endif // EXPECTED_OUTPUT
Loading…
Cancel
Save