public DacLibrary(DataTarget dataTarget, string dacDll) { if (dataTarget is null) { throw new ArgumentNullException(nameof(dataTarget)); } if (dataTarget.ClrVersions.Count == 0) { throw new ClrDiagnosticsException("Process is not a CLR process!"); } IntPtr dacLibrary = DataTarget.PlatformFunctions.LoadLibrary(dacDll); if (dacLibrary == IntPtr.Zero) { throw new ClrDiagnosticsException("Failed to load dac: " + dacLibrary); } OwningLibrary = new RefCountedFreeLibrary(dacLibrary); IntPtr initAddr = DataTarget.PlatformFunctions.GetProcAddress(dacLibrary, "DAC_PAL_InitializeDLL"); if (initAddr == IntPtr.Zero) { initAddr = DataTarget.PlatformFunctions.GetProcAddress(dacLibrary, "PAL_InitializeDLL"); } if (initAddr != IntPtr.Zero) { IntPtr dllMain = DataTarget.PlatformFunctions.GetProcAddress(dacLibrary, "DllMain"); if (dllMain == IntPtr.Zero) { throw new ClrDiagnosticsException("Failed to obtain Dac DllMain"); } DllMain main = (DllMain)Marshal.GetDelegateForFunctionPointer(dllMain, typeof(DllMain)); main(dacLibrary, 1, IntPtr.Zero); } IntPtr addr = DataTarget.PlatformFunctions.GetProcAddress(dacLibrary, "CLRDataCreateInstance"); if (addr == IntPtr.Zero) { throw new ClrDiagnosticsException("Failed to obtain Dac CLRDataCreateInstance"); } DacDataTarget = new DacDataTargetWrapper(dataTarget); CreateDacInstance func = (CreateDacInstance)Marshal.GetDelegateForFunctionPointer(addr, typeof(CreateDacInstance)); Guid guid = new Guid("5c552ab6-fc09-4cb3-8e36-22fa03c798b7"); int res = func(ref guid, DacDataTarget.IDacDataTarget, out IntPtr iUnk); if (res != 0) { throw new ClrDiagnosticsException($"Failure loading DAC: CreateDacInstance failed 0x{res:x}", ClrDiagnosticsExceptionKind.DacError, res); } InternalDacPrivateInterface = new ClrDataProcess(this, iUnk); }
public DacLibrary(DataTarget dataTarget, IntPtr pClrDataProcess) { if (dataTarget is null) { throw new ArgumentNullException(nameof(dataTarget)); } if (pClrDataProcess == IntPtr.Zero) { throw new ArgumentNullException(nameof(pClrDataProcess)); } InternalDacPrivateInterface = new ClrDataProcess(this, pClrDataProcess); DacDataTarget = new DacDataTargetWrapper(dataTarget); }
public RuntimeBase(ClrInfo info, DataTargetImpl dataTarget, DacLibrary lib) { Debug.Assert(lib != null); Debug.Assert(lib.InternalDacPrivateInterface != null); ClrInfo = info; _dataTarget = dataTarget; DacLibrary = lib; _dacInterface = DacLibrary.InternalDacPrivateInterface; InitApi(); _dacInterface.Flush(); IGCInfo data = GetGCInfo(); if (data != null) { ServerGC = data.ServerMode; HeapCount = data.HeapCount; CanWalkHeap = data.GCStructuresValid; } _dataReader = dataTarget.DataReader; }
internal DacLibrary(DataTargetImpl dataTarget, IntPtr pUnk) { InternalDacPrivateInterface = new ClrDataProcess(this, pUnk); }
internal DacLibrary(IntPtr pUnk) { InternalDacPrivateInterface = new ClrDataProcess(this, pUnk); }