Skip to content

Commit

Permalink
Improve error message on decompiler crashes
Browse files Browse the repository at this point in the history
  • Loading branch information
dgrunwald committed Jun 9, 2019
1 parent fe4a80e commit 4e173cc
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 8 deletions.
12 changes: 8 additions & 4 deletions ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs
Expand Up @@ -351,10 +351,14 @@ CSharpDecompiler CreateDecompiler(DecompilerTypeSystem ts)
},
delegate (IGrouping<string, TypeDefinitionHandle> file) {
using (StreamWriter w = new StreamWriter(Path.Combine(targetDirectory, file.Key))) {
CSharpDecompiler decompiler = CreateDecompiler(ts);
decompiler.CancellationToken = cancellationToken;
var syntaxTree = decompiler.DecompileTypes(file.ToArray());
syntaxTree.AcceptVisitor(new CSharpOutputVisitor(w, settings.CSharpFormattingOptions));
try {
CSharpDecompiler decompiler = CreateDecompiler(ts);
decompiler.CancellationToken = cancellationToken;
var syntaxTree = decompiler.DecompileTypes(file.ToArray());
syntaxTree.AcceptVisitor(new CSharpOutputVisitor(w, settings.CSharpFormattingOptions));
} catch (Exception innerException) when (!(innerException is OperationCanceledException || innerException is DecompilerException)) {
throw new DecompilerException(module, $"Error decompiling for '{file.Key}'", innerException);
}
}
});
return files.Select(f => Tuple.Create("Compile", f.Key)).Concat(WriteAssemblyInfo(ts, cancellationToken));
Expand Down
18 changes: 14 additions & 4 deletions ICSharpCode.Decompiler/DecompilerException.cs
Expand Up @@ -25,6 +25,7 @@
using System.Runtime.Serialization;
using System.Security;
using System.Text;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;

namespace ICSharpCode.Decompiler
Expand All @@ -34,20 +35,28 @@ namespace ICSharpCode.Decompiler
/// </summary>
public class DecompilerException : Exception, ISerializable
{
public string AssemblyName => Module.AssemblyName;
public string AssemblyName => File.Name;

public string FileName => Module.PEFile.FileName;
public string FileName => File.FileName;

public IEntity DecompiledEntity { get; }
public IModule Module { get; }
public PEFile File { get; }

public DecompilerException(MetadataModule module, IEntity decompiledEntity, Exception innerException, string message = null)
: base((message ?? "Error decompiling " + decompiledEntity?.FullName) + Environment.NewLine, innerException)
: base(message ?? "Error decompiling " + decompiledEntity?.FullName, innerException)
{
this.File = module.PEFile;
this.Module = module;
this.DecompiledEntity = decompiledEntity;
}

public DecompilerException(PEFile file, string message, Exception innerException)
: base(message, innerException)
{
this.File = file;
}

// This constructor is needed for serialization.
protected DecompilerException(SerializationInfo info, StreamingContext context) : base(info, context)
{
Expand All @@ -71,7 +80,8 @@ string ToString(Exception exception)
+ stacktrace;
exceptionType = GetTypeName(exception);
}
return this.Message
return this.Message + Environment.NewLine
+ $"in assembly \"{this.FileName}\"" + Environment.NewLine
+ " ---> " + exceptionType + ": " + exception.Message + Environment.NewLine
+ stacktrace;
}
Expand Down

0 comments on commit 4e173cc

Please sign in to comment.