Skip to content
Permalink
Browse files

Improve error message on decompiler crashes

  • Loading branch information...
dgrunwald committed Jun 9, 2019
1 parent fe4a80e commit 4e173cc885512ac26f8692a7ee373bf10d0226af
@@ -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));
@@ -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
@@ -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)
{
@@ -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;
}

0 comments on commit 4e173cc

Please sign in to comment.
You can’t perform that action at this time.