@@ -837,6 +837,73 @@ void AppendToBrowsable(Dictionary<string, DebuggerBrowsableState?> dict, CustomA
837
837
public override string ToString ( ) => "TypeInfo('" + FullName + "')" ;
838
838
}
839
839
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
+
840
907
internal sealed class AssemblyInfo
841
908
{
842
909
private static int next_id ;
@@ -894,77 +961,27 @@ private AssemblyInfo(ILogger logger)
894
961
this . id = Interlocked . Increment ( ref next_id ) ;
895
962
this . logger = logger ;
896
963
}
897
-
898
964
private static AssemblyInfo FromPEReader ( MonoProxy monoProxy , SessionId sessionId , PEReader peReader , byte [ ] pdb , ILogger logger , CancellationToken token )
899
965
{
900
966
901
967
var debugProvider = new PortableExecutableDebugMetadataProvider ( peReader ) ;
902
968
903
969
var asmMetadataReader = PEReaderExtensions . GetMetadataReader ( peReader ) ;
904
970
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 ) ;
906
972
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 ) ;
908
974
return assemblyInfo ;
909
975
}
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
-
958
976
private static AssemblyInfo FromWebcilReader ( MonoProxy monoProxy , SessionId sessionId , WebcilReader wcReader , byte [ ] pdb , ILogger logger , CancellationToken token )
959
977
{
960
978
var debugProvider = new WebcilDebugMetadataProvider ( wcReader ) ;
961
979
var asmMetadataReader = wcReader . GetMetadataReader ( ) ;
962
980
string name = ReadAssemblyName ( asmMetadataReader ) ;
963
981
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 ) ;
966
983
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 ) ;
968
985
return assemblyInfo ;
969
986
}
970
987
0 commit comments