Skip to content

Commit 4d38900

Browse files
Fix #3522: Improve error handling in DebugDirectoryTreeNode by reusing ErrorTreeNode.
1 parent e34db06 commit 4d38900

File tree

2 files changed

+71
-49
lines changed

2 files changed

+71
-49
lines changed

ILSpy/Metadata/DebugDirectoryTreeNode.cs

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#nullable enable
2020

21+
using System;
2122
using System.Collections.Generic;
2223
using System.Reflection.PortableExecutable;
2324

@@ -68,30 +69,37 @@ protected override void LoadChildren()
6869
{
6970
foreach (var entry in module.Reader.ReadDebugDirectory())
7071
{
71-
switch (entry.Type)
72+
try
7273
{
73-
case DebugDirectoryEntryType.CodeView:
74-
var codeViewData = module.Reader.ReadCodeViewDebugDirectoryData(entry);
75-
this.Children.Add(new CodeViewTreeNode(codeViewData));
76-
break;
77-
78-
case DebugDirectoryEntryType.EmbeddedPortablePdb:
79-
var embeddedPortablePdbProvider = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry);
80-
var embeddedPortablePdbMetadataFile = new MetadataFile(MetadataFile.MetadataFileKind.ProgramDebugDatabase, module.FileName, embeddedPortablePdbProvider, isEmbedded: true);
81-
this.Children.Add(new MetadataTreeNode(embeddedPortablePdbMetadataFile, "Debug Metadata (Embedded)"));
82-
break;
83-
84-
case DebugDirectoryEntryType.PdbChecksum:
85-
var pdbChecksumData = module.Reader.ReadPdbChecksumDebugDirectoryData(entry);
86-
this.Children.Add(new PdbChecksumTreeNode(pdbChecksumData));
87-
break;
88-
89-
case DebugDirectoryEntryType.Unknown:
90-
case DebugDirectoryEntryType.Coff:
91-
case DebugDirectoryEntryType.Reproducible:
92-
default:
93-
this.Children.Add(new DebugDirectoryEntryTreeNode(module, entry));
94-
break;
74+
switch (entry.Type)
75+
{
76+
case DebugDirectoryEntryType.CodeView:
77+
var codeViewData = module.Reader.ReadCodeViewDebugDirectoryData(entry);
78+
this.Children.Add(new CodeViewTreeNode(codeViewData));
79+
break;
80+
81+
case DebugDirectoryEntryType.EmbeddedPortablePdb:
82+
var embeddedPortablePdbProvider = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry);
83+
var embeddedPortablePdbMetadataFile = new MetadataFile(MetadataFile.MetadataFileKind.ProgramDebugDatabase, module.FileName, embeddedPortablePdbProvider, isEmbedded: true);
84+
this.Children.Add(new MetadataTreeNode(embeddedPortablePdbMetadataFile, "Debug Metadata (Embedded)"));
85+
break;
86+
87+
case DebugDirectoryEntryType.PdbChecksum:
88+
var pdbChecksumData = module.Reader.ReadPdbChecksumDebugDirectoryData(entry);
89+
this.Children.Add(new PdbChecksumTreeNode(pdbChecksumData));
90+
break;
91+
92+
case DebugDirectoryEntryType.Unknown:
93+
case DebugDirectoryEntryType.Coff:
94+
case DebugDirectoryEntryType.Reproducible:
95+
default:
96+
this.Children.Add(new DebugDirectoryEntryTreeNode(module, entry));
97+
break;
98+
}
99+
}
100+
catch (BadImageFormatException ex)
101+
{
102+
this.Children.Add(new ErrorTreeNode(ex));
95103
}
96104
}
97105
}

ILSpy/TreeNodes/ThreadingSupport.cs

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
using ICSharpCode.ILSpy.Properties;
3232
using ICSharpCode.ILSpyX.TreeView;
3333

34+
#nullable enable
35+
3436
namespace ICSharpCode.ILSpy.TreeNodes
3537
{
3638
/// <summary>
@@ -40,7 +42,7 @@ class ThreadingSupport
4042
{
4143
readonly Stopwatch stopwatch = new Stopwatch();
4244
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
43-
Task<List<SharpTreeNode>> loadChildrenTask;
45+
Task<List<SharpTreeNode>>? loadChildrenTask;
4446

4547
public bool IsRunning {
4648
get { return loadChildrenTask != null && !loadChildrenTask.IsCompleted; }
@@ -67,7 +69,7 @@ public void LoadChildren(SharpTreeNode node, Func<CancellationToken, IEnumerable
6769
CancellationToken ct = cancellationTokenSource.Token;
6870

6971
var fetchChildrenEnumerable = fetchChildren(ct);
70-
Task<List<SharpTreeNode>> thisTask = null;
72+
Task<List<SharpTreeNode>>? thisTask = null;
7173
thisTask = new Task<List<SharpTreeNode>>(
7274
delegate {
7375
List<SharpTreeNode> result = new List<SharpTreeNode>();
@@ -103,7 +105,7 @@ public void LoadChildren(SharpTreeNode node, Func<CancellationToken, IEnumerable
103105
{
104106
foreach (Exception ex in continuation.Exception.InnerExceptions)
105107
{
106-
node.Children.Add(new ErrorTreeNode(ex.ToString()));
108+
node.Children.Add(new ErrorTreeNode(ex));
107109
}
108110
}
109111
}
@@ -148,29 +150,6 @@ public override void Decompile(Language language, ITextOutput output, Decompilat
148150
}
149151
}
150152

151-
sealed class ErrorTreeNode : ILSpyTreeNode
152-
{
153-
readonly string text;
154-
155-
public override object Text {
156-
get { return text; }
157-
}
158-
159-
public ErrorTreeNode(string text)
160-
{
161-
this.text = text;
162-
}
163-
164-
public override FilterResult Filter(LanguageSettings settings)
165-
{
166-
return FilterResult.Match;
167-
}
168-
169-
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
170-
{
171-
}
172-
}
173-
174153
[ExportContextMenuEntry(Header = nameof(Resources.CopyErrorMessage))]
175154
[Shared]
176155
sealed class CopyErrorMessageContextMenu : IContextMenuEntry
@@ -201,4 +180,39 @@ public void Execute(TextViewContext context)
201180
}
202181
}
203182
}
183+
184+
sealed class ErrorTreeNode : ILSpyTreeNode
185+
{
186+
public Exception? Exception { get; }
187+
188+
public override object Text { get; }
189+
190+
public override object Icon => Images.Load(this, "Images/Warning");
191+
192+
public ErrorTreeNode(Exception exception)
193+
: this(exception.Message)
194+
{
195+
this.Exception = exception;
196+
}
197+
198+
public ErrorTreeNode(string text)
199+
{
200+
this.Text = text;
201+
}
202+
203+
public override FilterResult Filter(LanguageSettings settings)
204+
{
205+
return FilterResult.Match;
206+
}
207+
208+
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
209+
{
210+
output.WriteLine(this.Text.ToString());
211+
output.WriteLine();
212+
if (this.Exception != null)
213+
{
214+
output.WriteLine(this.Exception.ToString());
215+
}
216+
}
217+
}
204218
}

0 commit comments

Comments
 (0)