Browse Source

Improved the filename -> symbol document resolution

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6113 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
David Srbecký 15 years ago
parent
commit
1ed9f6f251
  1. 9
      src/AddIns/Debugger/Debugger.Core/Interop/CorSymExtensionMethods.cs
  2. 61
      src/AddIns/Debugger/Debugger.Core/SourcecodeSegment.cs

9
src/AddIns/Debugger/Debugger.Core/Interop/CorSymExtensionMethods.cs

@ -47,6 +47,7 @@ namespace Debugger.Interop.CorSym @@ -47,6 +47,7 @@ namespace Debugger.Interop.CorSym
fixed(byte* pCheckSum = checkSum)
symDoc.GetCheckSum((uint)checkSum.Length, out actualLength, new IntPtr(pCheckSum));
}
if (actualLength == 0) return null;
Array.Resize(ref checkSum, (int)actualLength);
return checkSum;
}
@ -182,11 +183,9 @@ namespace Debugger.Interop.CorSym @@ -182,11 +183,9 @@ namespace Debugger.Interop.CorSym
public int CompareTo(SequencePoint other)
{
if (this.Line == other.Line) {
return this.Column.CompareTo(other.Column);
} else {
return this.Line.CompareTo(other.Line);
}
if (this.Line != other.Line) return this.Line.CompareTo(other.Line);
if (this.Column != other.Column) return this.Column.CompareTo(other.Column);
return this.Offset.CompareTo(other.Offset);
}
}
}

61
src/AddIns/Debugger/Debugger.Core/SourcecodeSegment.cs

@ -79,48 +79,47 @@ namespace Debugger @@ -79,48 +79,47 @@ namespace Debugger
{
}
/// <returns> "\lowercasename.cs" or absolute path </returns>
static string NormalizeFilename(string filename, out bool isRooted)
{
isRooted = Path.IsPathRooted(filename);
if (!isRooted) {
while (filename.StartsWith(@".\")) filename = filename.Substring(2);
if (!filename.StartsWith(@"\")) filename = @"\" + filename;
}
return filename.ToLowerInvariant();
}
static ISymUnmanagedDocument GetSymDocumentFromFilename(Module module, string filename, byte[] checksum)
{
if (filename == null) throw new ArgumentNullException("filename");
filename = filename.ToLower();
ISymUnmanagedDocument[] symDocs = module.SymDocuments;
// "c:\project\file.cs" N/A
if (Path.IsPathRooted(filename) && checksum == null) {
foreach(ISymUnmanagedDocument symDoc in symDocs) {
if (symDoc.GetURL().ToLower() == filename) return symDoc;
}
return null; // Not found
}
// Normalize input
bool filenameRooted;
filename = NormalizeFilename(filename, out filenameRooted);
// "c:\project\file.cs" 0123456789
if (Path.IsPathRooted(filename) && checksum != null) {
// Exact match of all the data that is available
foreach(ISymUnmanagedDocument symDoc in symDocs) {
if (symDoc.GetURL().ToLower() == filename) return symDoc;
}
// Not found - try to find using checksum
filename = Path.GetFileName(filename);
}
// "file.cs" N/A
if (!Path.IsPathRooted(filename) && checksum == null) {
if (!filename.StartsWith(@"\")) {
filename = @"\" + filename;
}
foreach(ISymUnmanagedDocument symDoc in symDocs) {
if (symDoc.GetURL().ToLower().EndsWith(filename)) return symDoc;
bool urlRooted;
string url = NormalizeFilename(symDoc.GetURL(), out urlRooted);
if (filenameRooted && urlRooted) {
if (url == filename) return symDoc;
} else if (filenameRooted && !urlRooted) {
if (filename.EndsWith(url)) return symDoc;
} else if (!filenameRooted && urlRooted) {
if (url.EndsWith(filename)) return symDoc;
} else {
if (url == filename) return symDoc;
}
return null; // Not found
}
// "file.cs" 0123456789
if (!Path.IsPathRooted(filename) && checksum != null) {
if (!filename.StartsWith(@"\")) {
filename = @"\" + filename;
}
// Relaxed matching if we have checksum
if (checksum != null) {
foreach(ISymUnmanagedDocument symDoc in symDocs) {
if (!symDoc.GetURL().ToLower().EndsWith(filename)) continue;
if (Path.GetFileName(filename).ToLowerInvariant() == Path.GetFileName(symDoc.GetURL()).ToLowerInvariant()) {
byte[] symDocCheckSum = symDoc.GetCheckSum();
if (symDocCheckSum.Length != checksum.Length) continue;
bool match = true;
@ -130,7 +129,7 @@ namespace Debugger @@ -130,7 +129,7 @@ namespace Debugger
if (!match) continue;
return symDoc;
}
return null; // Not found
}
}
return null;

Loading…
Cancel
Save