diff --git a/src/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs b/src/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs index 4086d9344080c9..5e42084ba62cf1 100644 --- a/src/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs +++ b/src/libraries/System.Net.Http/tests/UnitTests/DiagnosticsHelperTest.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using Microsoft.Diagnostics.Runtime.Utilities; using Microsoft.DotNet.RemoteExecutor; using Xunit; diff --git a/src/libraries/System.Runtime.InteropServices/tests/ComInterfaceGenerator.Tests/UnmanagedToManagedCustomMarshallingTests.cs b/src/libraries/System.Runtime.InteropServices/tests/ComInterfaceGenerator.Tests/UnmanagedToManagedCustomMarshallingTests.cs index af89c22e25fd3b..32c60575c8139c 100644 --- a/src/libraries/System.Runtime.InteropServices/tests/ComInterfaceGenerator.Tests/UnmanagedToManagedCustomMarshallingTests.cs +++ b/src/libraries/System.Runtime.InteropServices/tests/ComInterfaceGenerator.Tests/UnmanagedToManagedCustomMarshallingTests.cs @@ -7,7 +7,6 @@ using System.Runtime.InteropServices; using System.Runtime.InteropServices.Marshalling; using System.Threading; -using Microsoft.Diagnostics.Runtime; using SharedTypes; using Xunit; using static ComInterfaceGenerator.Tests.UnmanagedToManagedCustomMarshallingTests; diff --git a/src/libraries/System.Security.Cryptography/tests/X509Certificates/PublicKeyTests.cs b/src/libraries/System.Security.Cryptography/tests/X509Certificates/PublicKeyTests.cs index 61bbd4a537d047..3e15c11df3fb3b 100644 --- a/src/libraries/System.Security.Cryptography/tests/X509Certificates/PublicKeyTests.cs +++ b/src/libraries/System.Security.Cryptography/tests/X509Certificates/PublicKeyTests.cs @@ -5,7 +5,6 @@ using System.IO; using System.Security.Cryptography.SLHDsa.Tests; using System.Security.Cryptography.Tests; -using Microsoft.Diagnostics.Runtime.Interop; using Test.Cryptography; using Xunit; diff --git a/src/native/managed/cdac/tests/DumpTests/AsyncContinuationDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/AsyncContinuationDumpTests.cs index 29a9560735ab46..ce52b0cfec4ccd 100644 --- a/src/native/managed/cdac/tests/DumpTests/AsyncContinuationDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/AsyncContinuationDumpTests.cs @@ -16,7 +16,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class AsyncContinuationDumpTests : DumpTestBase { protected override string DebuggeeName => "AsyncContinuation"; - protected override string DumpType => "full"; [ConditionalTheory] [MemberData(nameof(TestConfigurations))] diff --git a/src/native/managed/cdac/tests/DumpTests/CCWDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/CCWDumpTests.cs index 6e08d149c42639..87092fefe01950 100644 --- a/src/native/managed/cdac/tests/DumpTests/CCWDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/CCWDumpTests.cs @@ -17,7 +17,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class CCWDumpTests : DumpTestBase { protected override string DebuggeeName => "CCW"; - protected override string DumpType => "full"; /// /// Enumerates all strong GC handles from the dump, dereferences each one to get diff --git a/src/native/managed/cdac/tests/DumpTests/ClrMdDumpHost.cs b/src/native/managed/cdac/tests/DumpTests/ClrMdDumpHost.cs index e94f7c5ebbc2f1..c17344d52b0501 100644 --- a/src/native/managed/cdac/tests/DumpTests/ClrMdDumpHost.cs +++ b/src/native/managed/cdac/tests/DumpTests/ClrMdDumpHost.cs @@ -2,6 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Collections.Generic; +using System.Reflection.PortableExecutable; +using System.IO; using Microsoft.Diagnostics.Runtime; namespace Microsoft.Diagnostics.DataContractReader.DumpTests; @@ -20,22 +23,30 @@ internal sealed class ClrMdDumpHost : IDisposable }; private readonly DataTarget _dataTarget; + private readonly string[] _searchPaths; public string DumpPath { get; } - private ClrMdDumpHost(string dumpPath, DataTarget dataTarget) + private ClrMdDumpHost(string dumpPath, DataTarget dataTarget, string[] searchPaths) { DumpPath = dumpPath; _dataTarget = dataTarget; + _searchPaths = searchPaths; } /// /// Open a crash dump and prepare it for cDAC analysis. /// - public static ClrMdDumpHost Open(string dumpPath) + /// Path to the crash dump file. + /// + /// Local directories to search for symbol files (e.g., System.Private.CoreLib, + /// debuggee DLLs). + /// + public static ClrMdDumpHost Open(string dumpPath, List additionalSymbolPaths) { DataTarget dataTarget = DataTarget.LoadDump(dumpPath); - return new ClrMdDumpHost(dumpPath, dataTarget); + + return new ClrMdDumpHost(dumpPath, dataTarget, additionalSymbolPaths.ToArray()); } /// @@ -45,7 +56,45 @@ public static ClrMdDumpHost Open(string dumpPath) public int ReadFromTarget(ulong address, Span buffer) { int bytesRead = _dataTarget.DataReader.Read(address, buffer); - return bytesRead == buffer.Length ? 0 : -1; + if (bytesRead == buffer.Length) + return 0; // success + + // If we couldn't read the full buffer, maybe it's in a PE image + ModuleInfo? info = GetModuleForAddress(address); + if (info is null || info.FileName is null) + { + return -1; + } + + string? foundFile = FindFileOnDisk(info.FileName); + if (foundFile is null) + { + return -1; + } + + using FileStream fs = File.OpenRead(foundFile); + using PEReader peReader = new PEReader(fs); + + int filled = bytesRead; + ulong current = address + (ulong)bytesRead; + while (filled < buffer.Length) + { + PEMemoryBlock block = peReader.GetSectionData((int)(current - info.ImageBase)); + if (block.Length == 0) + { + return -1; + } + + int toCopy = Math.Min(block.Length, buffer.Length - filled); + unsafe + { + new ReadOnlySpan(block.Pointer, toCopy).CopyTo(buffer.Slice(filled)); + } + filled += toCopy; + current += (ulong)toCopy; + } + + return 0; } /// @@ -57,6 +106,16 @@ public int GetThreadContext(uint threadId, uint contextFlags, Span buffer) return _dataTarget.DataReader.GetThreadContext(threadId, contextFlags, buffer) ? 0 : -1; } + private ModuleInfo? GetModuleForAddress(ulong address) + { + foreach (ModuleInfo module in _dataTarget.DataReader.EnumerateModules()) + { + if (address >= module.ImageBase && address < module.ImageBase + (ulong)module.ImageSize) + return module; + } + return null; + } + /// /// Locate the DotNetRuntimeContractDescriptor symbol address in the dump. /// Uses ClrMD's built-in export resolution which handles PE, ELF, and Mach-O formats. @@ -93,6 +152,24 @@ public ulong FindContractDescriptorAddress() throw new InvalidOperationException("Could not find DotNetRuntimeContractDescriptor export in any runtime module in the dump."); } + private string? FindFileOnDisk(string modulePath) + { + // for local runs + if (File.Exists(modulePath)) + return modulePath; + int lastSep = Math.Max(modulePath.LastIndexOf('/'), modulePath.LastIndexOf('\\')); + string fileName = lastSep >= 0 ? modulePath[(lastSep + 1)..] : modulePath; + + foreach (string searchPath in _searchPaths) + { + string candidate = Path.Combine(searchPath, fileName); + if (File.Exists(candidate)) + return candidate; + } + + return null; + } + private static bool IsRuntimeModule(string fileName) { foreach (string name in s_runtimeModuleNames) diff --git a/src/native/managed/cdac/tests/DumpTests/ComWrappersDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/ComWrappersDumpTests.cs index 8af9f758deef0e..51475936a7468d 100644 --- a/src/native/managed/cdac/tests/DumpTests/ComWrappersDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/ComWrappersDumpTests.cs @@ -17,7 +17,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class ComWrappersDumpTests : DumpTestBase { protected override string DebuggeeName => "ComWrappers"; - protected override string DumpType => "full"; [ConditionalTheory] [MemberData(nameof(TestConfigurations))] diff --git a/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiCCWDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiCCWDumpTests.cs index a08cfe17300e1c..e7bd9737845485 100644 --- a/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiCCWDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiCCWDumpTests.cs @@ -17,8 +17,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class DacDbiCCWDumpTests : DumpTestBase { protected override string DebuggeeName => "CCW"; - protected override string DumpType => "full"; - private DacDbiImpl CreateDacDbi() => new DacDbiImpl(Target, legacyObj: null); private (TargetPointer Ccw, TargetPointer InterfacePointer) FindBuiltInComCcwWithInterface() diff --git a/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiComWrappersDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiComWrappersDumpTests.cs index 0bcb2521ee5f92..02e1ade17bfca9 100644 --- a/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiComWrappersDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiComWrappersDumpTests.cs @@ -16,8 +16,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class DacDbiComWrappersDumpTests : DumpTestBase { protected override string DebuggeeName => "ComWrappers"; - protected override string DumpType => "full"; - private DacDbiImpl CreateDacDbi() => new DacDbiImpl(Target, legacyObj: null); [ConditionalTheory] diff --git a/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiLoaderDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiLoaderDumpTests.cs index d7a776ff19fc5f..8b7c92ca26066f 100644 --- a/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiLoaderDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiLoaderDumpTests.cs @@ -15,8 +15,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class DacDbiLoaderDumpTests : DumpTestBase { protected override string DebuggeeName => "MultiModule"; - protected override string DumpType => "full"; - private DacDbiImpl CreateDacDbi() => new DacDbiImpl(Target, legacyObj: null); private IEnumerable GetAllModules() diff --git a/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiRCWDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiRCWDumpTests.cs index 47f6ed89748625..90f0a7be73d2b6 100644 --- a/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiRCWDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/DacDbi/DacDbiRCWDumpTests.cs @@ -15,8 +15,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class DacDbiRCWDumpTests : DumpTestBase { protected override string DebuggeeName => "RCW"; - protected override string DumpType => "full"; - private DacDbiImpl CreateDacDbi() => new DacDbiImpl(Target, legacyObj: null); [ConditionalTheory] diff --git a/src/native/managed/cdac/tests/DumpTests/Debuggees/AsyncContinuation/AsyncContinuation.csproj b/src/native/managed/cdac/tests/DumpTests/Debuggees/AsyncContinuation/AsyncContinuation.csproj index f2c96fe50c786d..0c19ddc25f5675 100644 --- a/src/native/managed/cdac/tests/DumpTests/Debuggees/AsyncContinuation/AsyncContinuation.csproj +++ b/src/native/managed/cdac/tests/DumpTests/Debuggees/AsyncContinuation/AsyncContinuation.csproj @@ -4,7 +4,6 @@ $(Features);runtime-async=on true $(NoWarn);CA2007;CA2252 - - Full + Heap diff --git a/src/native/managed/cdac/tests/DumpTests/Debuggees/CCW/CCW.csproj b/src/native/managed/cdac/tests/DumpTests/Debuggees/CCW/CCW.csproj index 9d3e9f517d21fd..af8d23ccbb4fb4 100644 --- a/src/native/managed/cdac/tests/DumpTests/Debuggees/CCW/CCW.csproj +++ b/src/native/managed/cdac/tests/DumpTests/Debuggees/CCW/CCW.csproj @@ -1,6 +1,6 @@ - Full + Heap true diff --git a/src/native/managed/cdac/tests/DumpTests/Debuggees/ComWrappers/ComWrappers.csproj b/src/native/managed/cdac/tests/DumpTests/Debuggees/ComWrappers/ComWrappers.csproj index bb776824769fe6..75ae87c9e7195f 100644 --- a/src/native/managed/cdac/tests/DumpTests/Debuggees/ComWrappers/ComWrappers.csproj +++ b/src/native/managed/cdac/tests/DumpTests/Debuggees/ComWrappers/ComWrappers.csproj @@ -1,5 +1,5 @@ - Full + Heap diff --git a/src/native/managed/cdac/tests/DumpTests/Debuggees/ExceptionHandlingInfo/ExceptionHandlingInfo.csproj b/src/native/managed/cdac/tests/DumpTests/Debuggees/ExceptionHandlingInfo/ExceptionHandlingInfo.csproj index 51f5b66e60bf15..3168075e00e18e 100644 --- a/src/native/managed/cdac/tests/DumpTests/Debuggees/ExceptionHandlingInfo/ExceptionHandlingInfo.csproj +++ b/src/native/managed/cdac/tests/DumpTests/Debuggees/ExceptionHandlingInfo/ExceptionHandlingInfo.csproj @@ -1,6 +1,6 @@ - Full + Heap R2R;Jit diff --git a/src/native/managed/cdac/tests/DumpTests/Debuggees/LocalVariables/LocalVariables.csproj b/src/native/managed/cdac/tests/DumpTests/Debuggees/LocalVariables/LocalVariables.csproj index ff74b3456316da..1e89fd20359ec9 100644 --- a/src/native/managed/cdac/tests/DumpTests/Debuggees/LocalVariables/LocalVariables.csproj +++ b/src/native/managed/cdac/tests/DumpTests/Debuggees/LocalVariables/LocalVariables.csproj @@ -1,6 +1,6 @@ - Full + Heap Jit true diff --git a/src/native/managed/cdac/tests/DumpTests/Debuggees/MultiModule/MultiModule.csproj b/src/native/managed/cdac/tests/DumpTests/Debuggees/MultiModule/MultiModule.csproj index bb776824769fe6..75ae87c9e7195f 100644 --- a/src/native/managed/cdac/tests/DumpTests/Debuggees/MultiModule/MultiModule.csproj +++ b/src/native/managed/cdac/tests/DumpTests/Debuggees/MultiModule/MultiModule.csproj @@ -1,5 +1,5 @@ - Full + Heap diff --git a/src/native/managed/cdac/tests/DumpTests/Debuggees/RCW/RCW.csproj b/src/native/managed/cdac/tests/DumpTests/Debuggees/RCW/RCW.csproj index 8fbeb470e46055..4ddb526b439e94 100644 --- a/src/native/managed/cdac/tests/DumpTests/Debuggees/RCW/RCW.csproj +++ b/src/native/managed/cdac/tests/DumpTests/Debuggees/RCW/RCW.csproj @@ -2,7 +2,7 @@ $(NoWarn);CA1416 - Full + Heap true diff --git a/src/native/managed/cdac/tests/DumpTests/Debuggees/RCWCleanupList/RCWCleanupList.csproj b/src/native/managed/cdac/tests/DumpTests/Debuggees/RCWCleanupList/RCWCleanupList.csproj index 8fbeb470e46055..4ddb526b439e94 100644 --- a/src/native/managed/cdac/tests/DumpTests/Debuggees/RCWCleanupList/RCWCleanupList.csproj +++ b/src/native/managed/cdac/tests/DumpTests/Debuggees/RCWCleanupList/RCWCleanupList.csproj @@ -2,7 +2,7 @@ $(NoWarn);CA1416 - Full + Heap true diff --git a/src/native/managed/cdac/tests/DumpTests/Debuggees/StackWalk/StackWalk.csproj b/src/native/managed/cdac/tests/DumpTests/Debuggees/StackWalk/StackWalk.csproj index 51f5b66e60bf15..3168075e00e18e 100644 --- a/src/native/managed/cdac/tests/DumpTests/Debuggees/StackWalk/StackWalk.csproj +++ b/src/native/managed/cdac/tests/DumpTests/Debuggees/StackWalk/StackWalk.csproj @@ -1,6 +1,6 @@ - Full + Heap R2R;Jit diff --git a/src/native/managed/cdac/tests/DumpTests/Debuggees/SyncBlock/SyncBlock.csproj b/src/native/managed/cdac/tests/DumpTests/Debuggees/SyncBlock/SyncBlock.csproj index bb776824769fe6..75ae87c9e7195f 100644 --- a/src/native/managed/cdac/tests/DumpTests/Debuggees/SyncBlock/SyncBlock.csproj +++ b/src/native/managed/cdac/tests/DumpTests/Debuggees/SyncBlock/SyncBlock.csproj @@ -1,5 +1,5 @@ - Full + Heap diff --git a/src/native/managed/cdac/tests/DumpTests/DumpTestBase.cs b/src/native/managed/cdac/tests/DumpTests/DumpTestBase.cs index fe1a05ab99bca5..ed5870ca1ff838 100644 --- a/src/native/managed/cdac/tests/DumpTests/DumpTestBase.cs +++ b/src/native/managed/cdac/tests/DumpTests/DumpTestBase.cs @@ -105,7 +105,7 @@ protected void InitializeDumpTest(TestConfiguration config, string debuggeeName, throw new SkipTestException($"No {config.R2RMode} dump for {debuggeeName}: {dumpPath}"); } - _host = ClrMdDumpHost.Open(dumpPath); + _host = ClrMdDumpHost.Open(dumpPath, GetSymbolPaths(debuggeeName, versionDir)); ulong contractDescriptor = _host.FindContractDescriptorAddress(); bool created = ContractDescriptorTarget.TryCreate( @@ -245,6 +245,30 @@ private static bool IsVersionSkipped(string version) return false; } + /// + /// Collects local symbol paths for ClrMD to resolve modules in the dump. + /// Checks symbols/ directories in the helix payload (Helix and xplat dumps) + /// + private static List GetSymbolPaths(string debuggeeName, string versionDir) + { + List paths = []; + + // Symbols directory in the dump tree (populated by Helix commands before tarring) + string symbolsDir = Path.Combine(versionDir, "symbols"); + if (Directory.Exists(symbolsDir)) + { + string runtimeSymbols = Path.Combine(symbolsDir, "runtime"); + if (Directory.Exists(runtimeSymbols)) + paths.Add(runtimeSymbols); + + string debuggeeSymbols = Path.Combine(symbolsDir, "debuggees", debuggeeName); + if (Directory.Exists(debuggeeSymbols)) + paths.Add(debuggeeSymbols); + } + + return paths; + } + private static string? FindRepoRoot() { string? dir = AppContext.BaseDirectory; diff --git a/src/native/managed/cdac/tests/DumpTests/EcmaMetadataDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/EcmaMetadataDumpTests.cs index 97560b619c838f..189c697a04d4ad 100644 --- a/src/native/managed/cdac/tests/DumpTests/EcmaMetadataDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/EcmaMetadataDumpTests.cs @@ -14,7 +14,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class EcmaMetadataDumpTests : DumpTestBase { protected override string DebuggeeName => "MultiModule"; - protected override string DumpType => "full"; [ConditionalTheory] [MemberData(nameof(TestConfigurations))] diff --git a/src/native/managed/cdac/tests/DumpTests/ExceptionHandlingInfoDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/ExceptionHandlingInfoDumpTests.cs index 4b9ef9ffc4cf85..d8664081aeeaba 100644 --- a/src/native/managed/cdac/tests/DumpTests/ExceptionHandlingInfoDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/ExceptionHandlingInfoDumpTests.cs @@ -20,7 +20,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class ExceptionHandlingInfoDumpTests : DumpTestBase { protected override string DebuggeeName => "ExceptionHandlingInfo"; - protected override string DumpType => "full"; /// /// Finds the CodeBlockHandle for the CrashInExceptionHandler method by walking diff --git a/src/native/managed/cdac/tests/DumpTests/ISOSDacInterface13Tests.cs b/src/native/managed/cdac/tests/DumpTests/ISOSDacInterface13Tests.cs index 8d68373c1ad893..d4022249f04eb2 100644 --- a/src/native/managed/cdac/tests/DumpTests/ISOSDacInterface13Tests.cs +++ b/src/native/managed/cdac/tests/DumpTests/ISOSDacInterface13Tests.cs @@ -15,7 +15,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class ISOSDacInterface13Tests : DumpTestBase { protected override string DebuggeeName => "MultiModule"; - protected override string DumpType => "full"; [ConditionalTheory] [MemberData(nameof(TestConfigurations))] diff --git a/src/native/managed/cdac/tests/DumpTests/IXCLRDataAppDomainDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/IXCLRDataAppDomainDumpTests.cs index a4e01f3b5f1100..20c7f5cdeaa4c3 100644 --- a/src/native/managed/cdac/tests/DumpTests/IXCLRDataAppDomainDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/IXCLRDataAppDomainDumpTests.cs @@ -16,7 +16,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public unsafe class IXCLRDataAppDomainDumpTests : DumpTestBase { protected override string DebuggeeName => "StackWalk"; - protected override string DumpType => "full"; // ========== GetName ========== diff --git a/src/native/managed/cdac/tests/DumpTests/IXCLRDataFrameDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/IXCLRDataFrameDumpTests.cs index 49c1fee40eaa88..8fe1d7607ea5ba 100644 --- a/src/native/managed/cdac/tests/DumpTests/IXCLRDataFrameDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/IXCLRDataFrameDumpTests.cs @@ -16,7 +16,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public unsafe class IXCLRDataFrameDumpTests : DumpTestBase { protected override string DebuggeeName => "StackWalk"; - protected override string DumpType => "full"; // ========== GetContext ========== diff --git a/src/native/managed/cdac/tests/DumpTests/IXCLRDataMethodDefinitionDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/IXCLRDataMethodDefinitionDumpTests.cs index 66d0126b0b7ab7..d627f24e0ffbe6 100644 --- a/src/native/managed/cdac/tests/DumpTests/IXCLRDataMethodDefinitionDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/IXCLRDataMethodDefinitionDumpTests.cs @@ -19,7 +19,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public unsafe class IXCLRDataMethodDefinitionDumpTests : DumpTestBase { protected override string DebuggeeName => "StackWalk"; - protected override string DumpType => "full"; // ========== GetName ========== diff --git a/src/native/managed/cdac/tests/DumpTests/IXCLRDataValueDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/IXCLRDataValueDumpTests.cs index d838794a6c90be..11b4363288f490 100644 --- a/src/native/managed/cdac/tests/DumpTests/IXCLRDataValueDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/IXCLRDataValueDumpTests.cs @@ -19,7 +19,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public unsafe class IXCLRDataValueDumpTests : DumpTestBase { protected override string DebuggeeName => "LocalVariables"; - protected override string DumpType => "full"; // ========== GetSize ========== diff --git a/src/native/managed/cdac/tests/DumpTests/LoaderDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/LoaderDumpTests.cs index fc1d2b04c86be1..66a73a30c84cdd 100644 --- a/src/native/managed/cdac/tests/DumpTests/LoaderDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/LoaderDumpTests.cs @@ -15,7 +15,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class LoaderDumpTests : DumpTestBase { protected override string DebuggeeName => "MultiModule"; - protected override string DumpType => "full"; [ConditionalTheory] [MemberData(nameof(TestConfigurations))] diff --git a/src/native/managed/cdac/tests/DumpTests/RCWCleanupListDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/RCWCleanupListDumpTests.cs index 4312653a33c566..6575594de0e329 100644 --- a/src/native/managed/cdac/tests/DumpTests/RCWCleanupListDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/RCWCleanupListDumpTests.cs @@ -17,7 +17,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class RCWCleanupListDumpTests : DumpTestBase { protected override string DebuggeeName => "RCWCleanupList"; - protected override string DumpType => "full"; [ConditionalTheory] [MemberData(nameof(TestConfigurations))] diff --git a/src/native/managed/cdac/tests/DumpTests/RCWDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/RCWDumpTests.cs index c2d2e7a26d9592..78d8dcda0848c2 100644 --- a/src/native/managed/cdac/tests/DumpTests/RCWDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/RCWDumpTests.cs @@ -16,7 +16,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class RCWDumpTests : DumpTestBase { protected override string DebuggeeName => "RCW"; - protected override string DumpType => "full"; /// /// Walks all strong GC handles and returns all RCW pointers found, diff --git a/src/native/managed/cdac/tests/DumpTests/README.md b/src/native/managed/cdac/tests/DumpTests/README.md index 584c863a4d36d5..5c637320b35911 100644 --- a/src/native/managed/cdac/tests/DumpTests/README.md +++ b/src/native/managed/cdac/tests/DumpTests/README.md @@ -29,16 +29,19 @@ features and then calls `Environment.FailFast()` to produce a crash dump. | BasicThreads | Thread management, thread store | Heap | | GCRoots | GC object graphs, pinned handles | Heap | | ServerGC | Server GC mode heap structures | Heap | -| StackWalk | Deterministic call stack (Main→A→B→C→FailFast) | Full | -| MultiModule | Multi-assembly metadata resolution | Full | +| StackWalk | Deterministic call stack (Main→A→B→C→FailFast) | Heap | +| MultiModule | Multi-assembly metadata resolution | Heap | | TypeHierarchy | Type inheritance, method tables | Heap | | PInvokeStub | P/Invoke with SetLastError ILStub | Full | | VarargPInvoke | Vararg P/Invoke via __arglist (sprintf) | Full | -| SyncBlock | Sync block locks | Full | -| CCW | COM callable wrappers (CCW) on Windows | Full | -| RCWCleanupList | STA-context RCW entries in g_pRCWCleanupList on Windows | Full | -| RCW | COM RCW with populated interface entry cache on Windows | Full | -| ComWrappers | ComWrappers-based MOW and RCW | Full | +| SyncBlock | Sync block locks | Heap | +| CCW | COM callable wrappers (CCW) on Windows | Heap | +| RCWCleanupList | STA-context RCW entries in g_pRCWCleanupList on Windows | Heap | +| RCW | COM RCW with populated interface entry cache on Windows | Heap | +| ComWrappers | ComWrappers-based MOW and RCW | Heap | +| ExceptionHandlingInfo | EH clause reading test | Heap | +| LocalVariables | Info about local variables | Heap | +| AsyncContinuation | Reading async continuation method tables | Heap | The dump type is configured per-debuggee via the `DumpTypes` property in each debuggee's `.csproj` (default: `Heap`, set in `Debuggees/Directory.Build.props`). Debuggees that @@ -118,7 +121,7 @@ If `dump-info.json` is not present, OS-based skipping is silently disabled. Dumps are written to: ``` -artifacts/dumps/cdac/{version}/{dumptype}/{debuggee}/{debuggee}.dmp +artifacts/dumps/cdac/{version}/{dumptype}/{r2rmode}/{debuggee}/{debuggee}.dmp ``` For example: @@ -128,14 +131,18 @@ artifacts/dumps/cdac/ local/ dump-info.json heap/ - BasicThreads/BasicThreads.dmp + r2r/ + BasicThreads/BasicThreads.dmp + jit/ + BasicThreads/BasicThreads.dmp full/ - StackWalk/StackWalk.dmp - PInvokeStub/PInvokeStub.dmp + r2r/ + PInvokeStub/PInvokeStub.dmp net10.0/ dump-info.json full/ - TypeHierarchy/TypeHierarchy.dmp + r2r/ + TypeHierarchy/TypeHierarchy.dmp ``` ## Running Locally (Windows) diff --git a/src/native/managed/cdac/tests/DumpTests/RuntimeTypeSystemDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/RuntimeTypeSystemDumpTests.cs index f90889bf14ccb2..7abd590dff17e1 100644 --- a/src/native/managed/cdac/tests/DumpTests/RuntimeTypeSystemDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/RuntimeTypeSystemDumpTests.cs @@ -316,7 +316,7 @@ public void RuntimeTypeSystem_ConcreteTypesDoNotContainGenericVariables(TestConf [MemberData(nameof(TestConfigurations))] public void RuntimeTypeSystem_IsValueType(TestConfiguration config) { - InitializeDumpTest(config, "LocalVariables", "full"); + InitializeDumpTest(config); IRuntimeTypeSystem rts = Target.Contracts.RuntimeTypeSystem; ILoader loader = Target.Contracts.Loader; @@ -352,8 +352,7 @@ public void RuntimeTypeSystem_IsValueType(TestConfiguration config) [MemberData(nameof(TestConfigurations))] public void RuntimeTypeSystem_GenericTypeDefinitionContainsGenericVariables(TestConfiguration config) { - // TODO: use default debuggee as soon as heap dumps are fixed - InitializeDumpTest(config, "LocalVariables", "full"); + InitializeDumpTest(config); IRuntimeTypeSystem rts = Target.Contracts.RuntimeTypeSystem; ILoader loader = Target.Contracts.Loader; diff --git a/src/native/managed/cdac/tests/DumpTests/StackReferenceDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/StackReferenceDumpTests.cs index 952b361636a6f8..fe299495996aa4 100644 --- a/src/native/managed/cdac/tests/DumpTests/StackReferenceDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/StackReferenceDumpTests.cs @@ -14,7 +14,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class StackReferenceDumpTests : DumpTestBase { protected override string DebuggeeName => "StackWalk"; - protected override string DumpType => "full"; // --- StackWalk debuggee: basic stack walk --- @@ -23,7 +22,7 @@ public class StackReferenceDumpTests : DumpTestBase [SkipOnVersion("net10.0", "InlinedCallFrame.Datum was added after net10.0")] public void WalkStackReferences_ReturnsWithoutThrowing(TestConfiguration config) { - InitializeDumpTest(config, "StackWalk", "full"); + InitializeDumpTest(config, "StackWalk", "heap"); IStackWalk stackWalk = Target.Contracts.StackWalk; ThreadData crashingThread = DumpTestHelpers.FindFailFastThread(Target); @@ -37,7 +36,7 @@ public void WalkStackReferences_ReturnsWithoutThrowing(TestConfiguration config) [SkipOnVersion("net10.0", "InlinedCallFrame.Datum was added after net10.0")] public void WalkStackReferences_RefsHaveValidSourceInfo(TestConfiguration config) { - InitializeDumpTest(config, "StackWalk", "full"); + InitializeDumpTest(config, "StackWalk", "heap"); IStackWalk stackWalk = Target.Contracts.StackWalk; ThreadData crashingThread = DumpTestHelpers.FindFailFastThread(Target); diff --git a/src/native/managed/cdac/tests/DumpTests/StackWalkDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/StackWalkDumpTests.cs index 65c0b9597ffa8f..92e3dc12f1f7a7 100644 --- a/src/native/managed/cdac/tests/DumpTests/StackWalkDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/StackWalkDumpTests.cs @@ -18,7 +18,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class StackWalkDumpTests : DumpTestBase { protected override string DebuggeeName => "StackWalk"; - protected override string DumpType => "full"; // ========== StackWalk debuggee ========== diff --git a/src/native/managed/cdac/tests/DumpTests/SyncBlockDumpTests.cs b/src/native/managed/cdac/tests/DumpTests/SyncBlockDumpTests.cs index 6b6fdcc2bb20a7..8ccb7ffb95fb0e 100644 --- a/src/native/managed/cdac/tests/DumpTests/SyncBlockDumpTests.cs +++ b/src/native/managed/cdac/tests/DumpTests/SyncBlockDumpTests.cs @@ -14,7 +14,6 @@ namespace Microsoft.Diagnostics.DataContractReader.DumpTests; public class SyncBlockDumpTests : DumpTestBase { protected override string DebuggeeName => "SyncBlock"; - protected override string DumpType => "full"; [ConditionalTheory] [MemberData(nameof(TestConfigurations))] diff --git a/src/native/managed/cdac/tests/DumpTests/cdac-dump-helix.proj b/src/native/managed/cdac/tests/DumpTests/cdac-dump-helix.proj index 8b511d859801fc..cfa86393468487 100644 --- a/src/native/managed/cdac/tests/DumpTests/cdac-dump-helix.proj +++ b/src/native/managed/cdac/tests/DumpTests/cdac-dump-helix.proj @@ -165,6 +165,42 @@ Include="echo '{"os":"$(TargetOS)","arch":"$(TargetArchitecture)","debuggees":[$(_EvalDebuggeeJsonArray)]}' > $HELIX_WORKITEM_PAYLOAD/dumps/local/dump-info.json" /> + + + + + + + + <_HelixCommandLines Condition="'$(TargetOS)' == 'windows'" + Include="echo === Copying symbols ===" /> + <_HelixCommandLines Condition="'$(TargetOS)' == 'windows'" + Include="mkdir %25HELIX_WORKITEM_PAYLOAD%25\dumps\local\symbols\runtime" /> + <_HelixCommandLines Condition="'$(TargetOS)' == 'windows'" + Include="for /D %25%25v in (%25HELIX_CORRELATION_PAYLOAD%25\shared\Microsoft.NETCore.App\*) do (echo === Processing folder: %25%25v === & dir %25%25v & echo Copying System.Private.CoreLib.dll & copy "%25%25v\System.Private.CoreLib.dll" "%25HELIX_WORKITEM_PAYLOAD%25\dumps\local\symbols\runtime\" & echo === Done with %25%25v === & echo)" /> + + <_HelixCommandLines Condition="'$(TargetOS)' == 'windows'" + Include="@(_UniqueDebuggee->'mkdir %25HELIX_WORKITEM_PAYLOAD%25\dumps\local\symbols\debuggees\%(Identity)')" /> + <_HelixCommandLines Condition="'$(TargetOS)' == 'windows'" + Include="@(_UniqueDebuggee->'copy "%25HELIX_WORKITEM_PAYLOAD%25\debuggees\%(Identity)\%(Identity).dll" "%25HELIX_WORKITEM_PAYLOAD%25\dumps\local\symbols\debuggees\%(Identity)\"')" /> + + + <_HelixCommandLines Condition="'$(TargetOS)' != 'windows'" + Include="echo '=== Copying symbols ==='" /> + <_HelixCommandLines Condition="'$(TargetOS)' != 'windows'" + Include="mkdir -p $HELIX_WORKITEM_PAYLOAD/dumps/local/symbols/runtime" /> + <_HelixCommandLines Condition="'$(TargetOS)' != 'windows'" + Include="cp $HELIX_CORRELATION_PAYLOAD/shared/Microsoft.NETCore.App/*/System.Private.CoreLib.dll $HELIX_WORKITEM_PAYLOAD/dumps/local/symbols/runtime/" /> + + <_HelixCommandLines Condition="'$(TargetOS)' != 'windows'" + Include="@(_UniqueDebuggee->'mkdir -p $HELIX_WORKITEM_PAYLOAD/dumps/local/symbols/debuggees/%(Identity)')" /> + <_HelixCommandLines Condition="'$(TargetOS)' != 'windows'" + Include="@(_UniqueDebuggee->'cp $HELIX_WORKITEM_PAYLOAD/debuggees/%(Identity)/%(Identity).dll $HELIX_WORKITEM_PAYLOAD/dumps/local/symbols/debuggees/%(Identity)/')" /> + + <_HelixCommandLines Condition="'$(TargetOS)' == 'windows'"