Skip to content

Commit 5b5e844

Browse files
committed
Move common logic to a MetadataDebugSummary class
1 parent 9145ad6 commit 5b5e844

File tree

1 file changed

+71
-54
lines changed

1 file changed

+71
-54
lines changed

src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs

Lines changed: 71 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,73 @@ void AppendToBrowsable(Dictionary<string, DebuggerBrowsableState?> dict, CustomA
837837
public override string ToString() => "TypeInfo('" + FullName + "')";
838838
}
839839

840+
/// <summary>
841+
/// Information we can extract directly from the assembly image using metadata readers
842+
/// </summary>
843+
internal sealed class MetadataDebugSummary
844+
{
845+
internal MetadataReader PdbMetadataReader { get; private init; }
846+
internal bool IsPortableCodeView { get; private init; }
847+
internal PdbChecksum[] PdbChecksums { get; private init; }
848+
849+
internal CodeViewDebugDirectoryData? CodeViewData { get; private init; }
850+
851+
private MetadataDebugSummary(MetadataReader pdbMetadataReader, bool isPortableCodeView, PdbChecksum[] pdbChecksums, CodeViewDebugDirectoryData? codeViewData)
852+
{
853+
PdbMetadataReader = pdbMetadataReader;
854+
IsPortableCodeView = isPortableCodeView;
855+
PdbChecksums = pdbChecksums;
856+
CodeViewData = codeViewData;
857+
}
858+
859+
internal static MetadataDebugSummary Create(MonoProxy monoProxy, SessionId sessionId, string name, IDebugMetadataProvider provider, byte[] pdb, CancellationToken token)
860+
{
861+
var entries = provider.ReadDebugDirectory();
862+
CodeViewDebugDirectoryData? codeViewData = null;
863+
bool isPortableCodeView = false;
864+
List<PdbChecksum> pdbChecksums = new();
865+
foreach (var entry in entries)
866+
{
867+
if (entry.Type == DebugDirectoryEntryType.CodeView)
868+
{
869+
codeViewData = provider.ReadCodeViewDebugDirectoryData(entry);
870+
if (entry.IsPortableCodeView)
871+
isPortableCodeView = true;
872+
}
873+
if (entry.Type == DebugDirectoryEntryType.PdbChecksum)
874+
{
875+
var checksum = provider.ReadPdbChecksumDebugDirectoryData(entry);
876+
pdbChecksums.Add(new PdbChecksum(checksum.AlgorithmName, checksum.Checksum.ToArray()));
877+
}
878+
}
879+
880+
MetadataReader pdbMetadataReader = null;
881+
if (pdb != null)
882+
{
883+
var pdbStream = new MemoryStream(pdb);
884+
try
885+
{
886+
// MetadataReaderProvider.FromPortablePdbStream takes ownership of the stream
887+
pdbMetadataReader = MetadataReaderProvider.FromPortablePdbStream(pdbStream).GetMetadataReader();
888+
}
889+
catch (BadImageFormatException)
890+
{
891+
monoProxy.SendLog(sessionId, $"Warning: Unable to read debug information of: {name} (use DebugType=Portable/Embedded)", token);
892+
}
893+
}
894+
else
895+
{
896+
var embeddedPdbEntry = entries.FirstOrDefault(e => e.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
897+
if (embeddedPdbEntry.DataSize != 0)
898+
{
899+
pdbMetadataReader = provider.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdbEntry).GetMetadataReader();
900+
}
901+
}
902+
903+
return new MetadataDebugSummary(pdbMetadataReader, isPortableCodeView, pdbChecksums.ToArray(), codeViewData);
904+
}
905+
}
906+
840907
internal sealed class AssemblyInfo
841908
{
842909
private static int next_id;
@@ -894,77 +961,27 @@ private AssemblyInfo(ILogger logger)
894961
this.id = Interlocked.Increment(ref next_id);
895962
this.logger = logger;
896963
}
897-
898964
private static AssemblyInfo FromPEReader(MonoProxy monoProxy, SessionId sessionId, PEReader peReader, byte[] pdb, ILogger logger, CancellationToken token)
899965
{
900966

901967
var debugProvider = new PortableExecutableDebugMetadataProvider(peReader);
902968

903969
var asmMetadataReader = PEReaderExtensions.GetMetadataReader(peReader);
904970
string name = ReadAssemblyName(asmMetadataReader);
905-
ReadDebugEntries(monoProxy, sessionId, name, debugProvider, pdb, out var codeViewData, out var isPortableCodeView, out var pdbChecksums, out var pdbMetadataReader, token);
971+
var summary = MetadataDebugSummary.Create(monoProxy, sessionId, name, debugProvider, pdb, token);
906972

907-
var assemblyInfo = new AssemblyInfo(peReader, name, asmMetadataReader, codeViewData, pdbChecksums.ToArray(), isPortableCodeView, pdbMetadataReader, logger);
973+
var assemblyInfo = new AssemblyInfo(peReader, name, asmMetadataReader, summary.CodeViewData, summary.PdbChecksums, summary.IsPortableCodeView, summary.PdbMetadataReader, logger);
908974
return assemblyInfo;
909975
}
910-
911-
private static void ReadDebugEntries(MonoProxy monoProxy, SessionId sessionId, string name, IDebugMetadataProvider provider, byte[] pdb, out CodeViewDebugDirectoryData? codeViewData, out bool isPortableCodeView, out List<PdbChecksum> pdbChecksums, out MetadataReader pdbMetadataReader, CancellationToken token)
912-
{
913-
var entries = provider.ReadDebugDirectory();
914-
codeViewData = null;
915-
isPortableCodeView = false;
916-
pdbChecksums = new();
917-
foreach (var entry in entries)
918-
{
919-
if (entry.Type == DebugDirectoryEntryType.CodeView)
920-
{
921-
codeViewData = provider.ReadCodeViewDebugDirectoryData(entry);
922-
if (entry.IsPortableCodeView)
923-
isPortableCodeView = true;
924-
}
925-
if (entry.Type == DebugDirectoryEntryType.PdbChecksum)
926-
{
927-
var checksum = provider.ReadPdbChecksumDebugDirectoryData(entry);
928-
pdbChecksums.Add(new PdbChecksum(checksum.AlgorithmName, checksum.Checksum.ToArray()));
929-
}
930-
}
931-
932-
pdbMetadataReader = null;
933-
if (pdb != null)
934-
{
935-
var pdbStream = new MemoryStream(pdb);
936-
try
937-
{
938-
// MetadataReaderProvider.FromPortablePdbStream takes ownership of the stream
939-
pdbMetadataReader = MetadataReaderProvider.FromPortablePdbStream(pdbStream).GetMetadataReader();
940-
}
941-
catch (BadImageFormatException)
942-
{
943-
monoProxy.SendLog(sessionId, $"Warning: Unable to read debug information of: {name} (use DebugType=Portable/Embedded)", token);
944-
}
945-
}
946-
else
947-
{
948-
var embeddedPdbEntry = entries.FirstOrDefault(e => e.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
949-
if (embeddedPdbEntry.DataSize != 0)
950-
{
951-
pdbMetadataReader = provider.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdbEntry).GetMetadataReader();
952-
}
953-
}
954-
955-
956-
}
957-
958976
private static AssemblyInfo FromWebcilReader(MonoProxy monoProxy, SessionId sessionId, WebcilReader wcReader, byte[] pdb, ILogger logger, CancellationToken token)
959977
{
960978
var debugProvider = new WebcilDebugMetadataProvider(wcReader);
961979
var asmMetadataReader = wcReader.GetMetadataReader();
962980
string name = ReadAssemblyName(asmMetadataReader);
963981

964-
ReadDebugEntries(monoProxy, sessionId, name, debugProvider, pdb, out var codeViewData, out var isPortableCodeView, out var pdbChecksums, out var pdbMetadataReader, token);
965-
982+
var summary = MetadataDebugSummary.Create(monoProxy, sessionId, name, debugProvider, pdb, token);
966983

967-
var assemblyInfo = new AssemblyInfo(wcReader, name, asmMetadataReader, codeViewData, pdbChecksums.ToArray(), isPortableCodeView, pdbMetadataReader, logger);
984+
var assemblyInfo = new AssemblyInfo(wcReader, name, asmMetadataReader, summary.CodeViewData, summary.PdbChecksums, summary.IsPortableCodeView, summary.PdbMetadataReader, logger);
968985
return assemblyInfo;
969986
}
970987

0 commit comments

Comments
 (0)