Browse Source

Improve exception handling related to PDBs and tree initialization

pull/2333/head
Siegfried Pammer 4 years ago
parent
commit
09ded09e76
  1. 2
      ILSpy/App.xaml.cs
  2. 59
      ILSpy/DebugInfo/PortableDebugInfoProvider.cs
  3. 22
      ILSpy/TreeNodes/AssemblyTreeNode.cs

2
ILSpy/App.xaml.cs

@ -191,7 +191,7 @@ namespace ICSharpCode.ILSpy
[ThreadStatic] [ThreadStatic]
static bool showingError; static bool showingError;
static void UnhandledException(Exception exception) internal static void UnhandledException(Exception exception)
{ {
Debug.WriteLine(exception.ToString()); Debug.WriteLine(exception.ToString());
for (Exception ex = exception; ex != null; ex = ex.InnerException) for (Exception ex = exception; ex != null; ex = ex.InnerException)

59
ILSpy/DebugInfo/PortableDebugInfoProvider.cs

@ -18,6 +18,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Reflection.Metadata; using System.Reflection.Metadata;
using ICSharpCode.Decompiler.DebugInfo; using ICSharpCode.Decompiler.DebugInfo;
@ -28,8 +29,8 @@ namespace ICSharpCode.Decompiler.PdbProvider
{ {
string pdbFileName; string pdbFileName;
string moduleFileName; string moduleFileName;
readonly MetadataReaderProvider provider;
internal MetadataReaderProvider Provider { get; } bool hasError;
internal bool IsEmbedded => pdbFileName == null; internal bool IsEmbedded => pdbFileName == null;
@ -38,20 +39,54 @@ namespace ICSharpCode.Decompiler.PdbProvider
{ {
this.pdbFileName = pdbFileName; this.pdbFileName = pdbFileName;
this.moduleFileName = moduleFileName; this.moduleFileName = moduleFileName;
this.Provider = provider ?? throw new ArgumentNullException(nameof(provider)); this.provider = provider ?? throw new ArgumentNullException(nameof(provider));
}
public string Description {
get {
if (pdbFileName == null)
{
if (hasError)
return "Error while loading the PDB stream embedded in this assembly";
return "Embedded in this assembly";
}
else
{
if (hasError)
return $"Error while loading portable PDB: {pdbFileName}";
return $"Loaded from portable PDB: {pdbFileName}";
}
}
} }
public string Description => pdbFileName == null internal MetadataReader GetMetadataReader()
? "Embedded in this assembly" {
: $"Loaded from portable PDB: {pdbFileName}"; try
{
hasError = false;
return provider.GetMetadataReader();
}
catch (BadImageFormatException)
{
hasError = true;
return null;
}
catch (IOException)
{
hasError = true;
return null;
}
}
public string SourceFileName => pdbFileName ?? moduleFileName; public string SourceFileName => pdbFileName ?? moduleFileName;
public IList<DebugInfo.SequencePoint> GetSequencePoints(MethodDefinitionHandle method) public IList<DebugInfo.SequencePoint> GetSequencePoints(MethodDefinitionHandle method)
{ {
var metadata = Provider.GetMetadataReader(); var metadata = GetMetadataReader();
var debugInfo = metadata.GetMethodDebugInformation(method); var debugInfo = metadata.GetMethodDebugInformation(method);
var sequencePoints = new List<Decompiler.DebugInfo.SequencePoint>(); var sequencePoints = new List<DebugInfo.SequencePoint>();
if (metadata == null)
return sequencePoints;
foreach (var point in debugInfo.GetSequencePoints()) foreach (var point in debugInfo.GetSequencePoints())
{ {
@ -82,8 +117,10 @@ namespace ICSharpCode.Decompiler.PdbProvider
public IList<Variable> GetVariables(MethodDefinitionHandle method) public IList<Variable> GetVariables(MethodDefinitionHandle method)
{ {
var metadata = Provider.GetMetadataReader(); var metadata = GetMetadataReader();
var variables = new List<Variable>(); var variables = new List<Variable>();
if (metadata == null)
return variables;
foreach (var h in metadata.GetLocalScopes(method)) foreach (var h in metadata.GetLocalScopes(method))
{ {
@ -100,8 +137,10 @@ namespace ICSharpCode.Decompiler.PdbProvider
public bool TryGetName(MethodDefinitionHandle method, int index, out string name) public bool TryGetName(MethodDefinitionHandle method, int index, out string name)
{ {
var metadata = Provider.GetMetadataReader(); var metadata = GetMetadataReader();
name = null; name = null;
if (metadata == null)
return false;
foreach (var h in metadata.GetLocalScopes(method)) foreach (var h in metadata.GetLocalScopes(method))
{ {

22
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -181,14 +181,21 @@ namespace ICSharpCode.ILSpy.TreeNodes
// if we crashed on loading, then we don't have any children // if we crashed on loading, then we don't have any children
return; return;
} }
if (loadResult.PEFile != null) try
{ {
LoadChildrenForPEFile(loadResult.PEFile); if (loadResult.PEFile != null)
{
LoadChildrenForPEFile(loadResult.PEFile);
}
else if (loadResult.Package != null)
{
var package = loadResult.Package;
this.Children.AddRange(PackageFolderTreeNode.LoadChildrenForFolder(package.RootFolder));
}
} }
else if (loadResult.Package != null) catch (Exception ex)
{ {
var package = loadResult.Package; App.UnhandledException(ex);
this.Children.AddRange(PackageFolderTreeNode.LoadChildrenForFolder(package.RootFolder));
} }
} }
@ -198,9 +205,10 @@ namespace ICSharpCode.ILSpy.TreeNodes
var assembly = (MetadataModule)typeSystem.MainModule; var assembly = (MetadataModule)typeSystem.MainModule;
this.Children.Add(new Metadata.MetadataTreeNode(module, this)); this.Children.Add(new Metadata.MetadataTreeNode(module, this));
Decompiler.DebugInfo.IDebugInfoProvider debugInfo = LoadedAssembly.GetDebugInfoOrNull(); Decompiler.DebugInfo.IDebugInfoProvider debugInfo = LoadedAssembly.GetDebugInfoOrNull();
if (debugInfo is Decompiler.PdbProvider.PortableDebugInfoProvider ppdb) if (debugInfo is Decompiler.PdbProvider.PortableDebugInfoProvider ppdb
&& ppdb.GetMetadataReader() is System.Reflection.Metadata.MetadataReader reader)
{ {
this.Children.Add(new Metadata.DebugMetadataTreeNode(module, ppdb.IsEmbedded, ppdb.Provider.GetMetadataReader(), this)); this.Children.Add(new Metadata.DebugMetadataTreeNode(module, ppdb.IsEmbedded, reader, this));
} }
this.Children.Add(new ReferenceFolderTreeNode(module, this)); this.Children.Add(new ReferenceFolderTreeNode(module, this));
if (module.Resources.Any()) if (module.Resources.Any())

Loading…
Cancel
Save