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. 10
      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 @@ -33,7 +33,7 @@ namespace Debugger
return process;
}
}
throw new DebuggerException("Process is not in collection");
return null;
}
internal void AddProcess(Process process)

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

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

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

@ -220,6 +220,9 @@ namespace Debugger @@ -220,6 +220,9 @@ namespace Debugger
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()
{
// Resume stoped tread
@ -235,7 +238,8 @@ namespace Debugger @@ -235,7 +238,8 @@ namespace Debugger
corProcess.Stop(uint.MaxValue);
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()

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

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

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

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

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

@ -55,15 +55,17 @@ namespace Debugger @@ -55,15 +55,17 @@ namespace Debugger
public ManagedCallback GetProcessCallbackInterface(ICorDebugProcess 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;
}
// 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("Ingoring callback of exited process");
process.TraceMessage("Ignoring callback of exited process (check failed)");
return null;
}
}
@ -72,9 +74,11 @@ namespace Debugger @@ -72,9 +74,11 @@ namespace Debugger
public void ExitProcess(ICorDebugProcess pProcess)
{
ManagedCallback managedCallback = debugger.GetProcess(pProcess).CallbackInterface;
ManagedCallback managedCallback = GetProcessCallbackInterface(pProcess);
if (managedCallback != null) {
managedCallback.ExitProcess(pProcess);
}
}
#region Program folow control

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

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

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

@ -69,6 +69,8 @@ @@ -69,6 +69,8 @@
<Compile Include="Src\TestPrograms\StackOverflow.cs" />
<Compile Include="Src\TestPrograms\Stepping.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\_Template.cs" />
<EmbeddedResource Include="Src\TestPrograms\*.xml" />

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

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

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

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

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

@ -0,0 +1,57 @@ @@ -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 @@ @@ -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