Browse Source

Walkaround for pdb locking, added test for it

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@862 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 20 years ago
parent
commit
102d63de31
  1. 23
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs
  2. 7
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs
  3. 26
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Modules/Module.cs
  4. 4
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/NDebugger-Processes.cs
  5. 3
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Debugger.Tests.csproj
  6. 49
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs
  7. 1
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestProgram.cs
  8. 19
      src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/FileRelease.cs

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

@ -384,24 +384,31 @@ namespace Debugger @@ -384,24 +384,31 @@ namespace Debugger
ExitCallback_Continue();
}
public void ExitProcess(ICorDebugProcess pProcess)
{
EnterCallback("ExitProcess", pProcess);
Process process = debugger.GetProcess(pProcess);
debugger.RemoveProcess(process);
if (debugger.Processes.Count == 0) {
debugger.TerminateDebugger();
// Exit callback and then terminate the debugger
new System.Threading.Thread(
delegate() {
debugger.MTA2STA.Call(
delegate {
debugger.TerminateDebugger();
});
}).Start();
}
}
#endregion
#region ICorDebugManagedCallback2 Members
public void ChangeConnection(ICorDebugProcess pProcess, uint dwConnectionId)
{
EnterCallback("ChangeConnection", pProcess);

7
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs

@ -130,11 +130,15 @@ namespace Debugger @@ -130,11 +130,15 @@ namespace Debugger
currentProcess = null;
pendingEvalsCollection.Clear();
TraceMessage("Reset done");
//corDebug.Terminate();
corDebug.Terminate();
TraceMessage("ICorDebug terminated");
noProcessesHandle.Set();
}
@ -197,6 +201,7 @@ namespace Debugger @@ -197,6 +201,7 @@ namespace Debugger
public VariableCollection LocalVariables {
get {
localVariables.Update();
return localVariables;
}
}

26
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Modules/Module.cs

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
// </file>
using System;
using System.IO;
using System.Diagnostics.SymbolStore;
using System.Runtime.InteropServices;
@ -19,13 +20,14 @@ namespace Debugger @@ -19,13 +20,14 @@ namespace Debugger
NDebugger debugger;
string fullPath;
string fullPathPDB;
ulong baseAdress;
int isDynamic;
int isInMemory;
int orderOfLoading = 0;
readonly ICorDebugModule corModule;
ISymbolReader symReader;
SymReader symReader;
IMetaDataImport metaDataInterface;
public NDebugger Debugger {
@ -40,7 +42,7 @@ namespace Debugger @@ -40,7 +42,7 @@ namespace Debugger
}
}
public ISymbolReader SymReader {
public SymReader SymReader {
get {
return symReader;
}
@ -150,7 +152,7 @@ namespace Debugger @@ -150,7 +152,7 @@ namespace Debugger
IntPtr ptr = IntPtr.Zero;
try {
ptr = Marshal.GetIUnknownForObject(metaDataInterface);
symReader = symBinder.GetReader(ptr, fullPath, string.Empty);
symReader = (SymReader)symBinder.GetReader(ptr, fullPath, string.Empty);
} catch (System.Exception) {
symReader = null;
} finally {
@ -159,6 +161,19 @@ namespace Debugger @@ -159,6 +161,19 @@ namespace Debugger
}
}
if (symReader != null) {
string tempPath = Path.Combine(Path.GetTempPath(), Path.Combine("DebeggerPdb", new Random().Next().ToString()));
string pdbFilename = Path.GetFileNameWithoutExtension(FullPath) + ".pdb";
string oldPdbPath = Path.Combine(Path.GetDirectoryName(FullPath), pdbFilename);
string newPdbPath = Path.Combine(tempPath, pdbFilename);
Directory.CreateDirectory(tempPath);
File.Copy(oldPdbPath, newPdbPath);
symReader.UpdateSymbolStore(newPdbPath, IntPtr.Zero);
fullPathPDB = newPdbPath;
}
JMCStatus = SymbolsLoaded;
}
@ -180,6 +195,11 @@ namespace Debugger @@ -180,6 +195,11 @@ namespace Debugger
} finally {
symReader = null;
}
try {
File.Delete(fullPathPDB);
} catch {
Console.WriteLine("Could not delete pdb temp file");
}
}
try {

4
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/NDebugger-Processes.cs

@ -50,9 +50,7 @@ namespace Debugger @@ -50,9 +50,7 @@ namespace Debugger
{
processCollection.Remove(process);
OnProcessExited(process);
if (processCollection.Count == 0) {
noProcessesHandle.Set();
}
// noProcessesHandle is set in NDebugger.TerminateDebugger
}
protected virtual void OnProcessStarted(Process process)

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

@ -45,6 +45,7 @@ @@ -45,6 +45,7 @@
<Compile Include="Src\TestPrograms\Breakpoint.cs" />
<Compile Include="Src\TestPrograms\Symbols.cs" />
<Compile Include="Src\TestPrograms\Break.cs" />
<Compile Include="Src\TestPrograms\FileRelease.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Src" />
@ -65,4 +66,4 @@ @@ -65,4 +66,4 @@
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>
</Project>

49
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs

@ -29,11 +29,13 @@ namespace Debugger.Tests @@ -29,11 +29,13 @@ namespace Debugger.Tests
string lastLogMessage;
string assemblyFilename;
string assemblyDir;
string symbolsFilename;
public DebuggerTests()
{
assemblyFilename = Assembly.GetExecutingAssembly().Location;
assemblyDir = Path.GetDirectoryName(assemblyFilename);
symbolsFilename = Path.Combine(assemblyDir, Path.GetFileNameWithoutExtension(assemblyFilename) + ".pdb");
debugger = new NDebugger();
debugger.MTA2STA.CallMethod = CallMethod.Manual;
@ -43,14 +45,18 @@ namespace Debugger.Tests @@ -43,14 +45,18 @@ namespace Debugger.Tests
};
}
void StartProgram(string name)
void StartProgram(string programName)
{
StartProgram(assemblyFilename, programName);
}
void StartProgram(string exeFilename, string programName)
{
log = "";
lastLogMessage = null;
debugger.Start(assemblyFilename, assemblyDir, name);
debugger.Start(exeFilename, Path.GetDirectoryName(exeFilename), programName);
}
[Test]
public void SimpleProgram()
{
@ -84,6 +90,8 @@ namespace Debugger.Tests @@ -84,6 +90,8 @@ namespace Debugger.Tests
[Test]
public void Symbols()
{
Assert.IsTrue(File.Exists(symbolsFilename), "Symbols file not found (.pdb)");
StartProgram("Symbols");
debugger.WaitForPause();
@ -124,5 +132,40 @@ namespace Debugger.Tests @@ -124,5 +132,40 @@ namespace Debugger.Tests
Assert.AreEqual("Mark 1\r\nMark 2\r\n", log);
}
[Test, Ignore("Works only if run alone")]
public void FileRelease()
{
Assert.IsTrue(File.Exists(assemblyFilename), "Assembly file not found");
Assert.IsTrue(File.Exists(symbolsFilename), "Symbols file not found (.pdb)");
string tempPath = Path.Combine(Path.GetTempPath(), Path.Combine("DebeggerTest", new Random().Next().ToString()));
Directory.CreateDirectory(tempPath);
string newAssemblyFilename = Path.Combine(tempPath, Path.GetFileName(assemblyFilename));
string newSymbolsFilename = Path.Combine(tempPath, Path.GetFileName(symbolsFilename));
File.Copy(assemblyFilename, newAssemblyFilename);
File.Copy(symbolsFilename, newSymbolsFilename);
Assert.IsTrue(File.Exists(newAssemblyFilename), "Assembly file copying failed");
Assert.IsTrue(File.Exists(newSymbolsFilename), "Symbols file copying failed");
StartProgram(newAssemblyFilename, "FileRelease");
debugger.WaitForPrecessExit();
try {
File.Delete(newAssemblyFilename);
} catch (System.Exception e) {
Assert.Fail("Assembly file not released\n" + e.ToString());
}
try {
File.Delete(newSymbolsFilename);
} catch (System.Exception e) {
Assert.Fail("Symbols file not released\n" + e.ToString());
}
}
}
}

1
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestProgram.cs

@ -21,6 +21,7 @@ namespace Debugger.Tests @@ -21,6 +21,7 @@ namespace Debugger.Tests
switch (args[0]) {
case "Break": Progs.Break.Main(); break;
case "Breakpoint": Progs.Breakpoint.Main(); break;
case "FileRelease": Progs.FileRelease.Main(); break;
case "HelloWorld": Progs.HelloWorld.Main(); break;
case "SimpleProgram": Progs.SimpleProgram.Main(); break;
case "Symbols": Progs.Symbols.Main(); break;

19
src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/FileRelease.cs

@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
// <version>$Revision$</version>
// </file>
using System;
namespace Debugger.Tests.TestPrograms
{
public class FileRelease
{
public static void Main()
{
}
}
}
Loading…
Cancel
Save