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. 7
      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. 1
      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

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

@ -394,7 +394,14 @@ namespace Debugger
debugger.RemoveProcess(process); debugger.RemoveProcess(process);
if (debugger.Processes.Count == 0) { if (debugger.Processes.Count == 0) {
// Exit callback and then terminate the debugger
new System.Threading.Thread(
delegate() {
debugger.MTA2STA.Call(
delegate {
debugger.TerminateDebugger(); debugger.TerminateDebugger();
});
}).Start();
} }
} }

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

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

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

@ -6,6 +6,7 @@
// </file> // </file>
using System; using System;
using System.IO;
using System.Diagnostics.SymbolStore; using System.Diagnostics.SymbolStore;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@ -19,13 +20,14 @@ namespace Debugger
NDebugger debugger; NDebugger debugger;
string fullPath; string fullPath;
string fullPathPDB;
ulong baseAdress; ulong baseAdress;
int isDynamic; int isDynamic;
int isInMemory; int isInMemory;
int orderOfLoading = 0; int orderOfLoading = 0;
readonly ICorDebugModule corModule; readonly ICorDebugModule corModule;
ISymbolReader symReader; SymReader symReader;
IMetaDataImport metaDataInterface; IMetaDataImport metaDataInterface;
public NDebugger Debugger { public NDebugger Debugger {
@ -40,7 +42,7 @@ namespace Debugger
} }
} }
public ISymbolReader SymReader { public SymReader SymReader {
get { get {
return symReader; return symReader;
} }
@ -150,7 +152,7 @@ namespace Debugger
IntPtr ptr = IntPtr.Zero; IntPtr ptr = IntPtr.Zero;
try { try {
ptr = Marshal.GetIUnknownForObject(metaDataInterface); ptr = Marshal.GetIUnknownForObject(metaDataInterface);
symReader = symBinder.GetReader(ptr, fullPath, string.Empty); symReader = (SymReader)symBinder.GetReader(ptr, fullPath, string.Empty);
} catch (System.Exception) { } catch (System.Exception) {
symReader = null; symReader = null;
} finally { } finally {
@ -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; JMCStatus = SymbolsLoaded;
} }
@ -180,6 +195,11 @@ namespace Debugger
} finally { } finally {
symReader = null; symReader = null;
} }
try {
File.Delete(fullPathPDB);
} catch {
Console.WriteLine("Could not delete pdb temp file");
}
} }
try { try {

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

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

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

@ -45,6 +45,7 @@
<Compile Include="Src\TestPrograms\Breakpoint.cs" /> <Compile Include="Src\TestPrograms\Breakpoint.cs" />
<Compile Include="Src\TestPrograms\Symbols.cs" /> <Compile Include="Src\TestPrograms\Symbols.cs" />
<Compile Include="Src\TestPrograms\Break.cs" /> <Compile Include="Src\TestPrograms\Break.cs" />
<Compile Include="Src\TestPrograms\FileRelease.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Src" /> <Folder Include="Src" />

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

@ -29,11 +29,13 @@ namespace Debugger.Tests
string lastLogMessage; string lastLogMessage;
string assemblyFilename; string assemblyFilename;
string assemblyDir; string assemblyDir;
string symbolsFilename;
public DebuggerTests() public DebuggerTests()
{ {
assemblyFilename = Assembly.GetExecutingAssembly().Location; assemblyFilename = Assembly.GetExecutingAssembly().Location;
assemblyDir = Path.GetDirectoryName(assemblyFilename); assemblyDir = Path.GetDirectoryName(assemblyFilename);
symbolsFilename = Path.Combine(assemblyDir, Path.GetFileNameWithoutExtension(assemblyFilename) + ".pdb");
debugger = new NDebugger(); debugger = new NDebugger();
debugger.MTA2STA.CallMethod = CallMethod.Manual; debugger.MTA2STA.CallMethod = CallMethod.Manual;
@ -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 = ""; log = "";
lastLogMessage = null; lastLogMessage = null;
debugger.Start(assemblyFilename, assemblyDir, name); debugger.Start(exeFilename, Path.GetDirectoryName(exeFilename), programName);
} }
[Test] [Test]
public void SimpleProgram() public void SimpleProgram()
{ {
@ -84,6 +90,8 @@ namespace Debugger.Tests
[Test] [Test]
public void Symbols() public void Symbols()
{ {
Assert.IsTrue(File.Exists(symbolsFilename), "Symbols file not found (.pdb)");
StartProgram("Symbols"); StartProgram("Symbols");
debugger.WaitForPause(); debugger.WaitForPause();
@ -124,5 +132,40 @@ namespace Debugger.Tests
Assert.AreEqual("Mark 1\r\nMark 2\r\n", log); 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
switch (args[0]) { switch (args[0]) {
case "Break": Progs.Break.Main(); break; case "Break": Progs.Break.Main(); break;
case "Breakpoint": Progs.Breakpoint.Main(); break; case "Breakpoint": Progs.Breakpoint.Main(); break;
case "FileRelease": Progs.FileRelease.Main(); break;
case "HelloWorld": Progs.HelloWorld.Main(); break; case "HelloWorld": Progs.HelloWorld.Main(); break;
case "SimpleProgram": Progs.SimpleProgram.Main(); break; case "SimpleProgram": Progs.SimpleProgram.Main(); break;
case "Symbols": Progs.Symbols.Main(); break; case "Symbols": Progs.Symbols.Main(); break;

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

@ -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