Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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;
        }
Beispiel #4
0
 internal DacLibrary(DataTargetImpl dataTarget, IntPtr pUnk)
 {
     InternalDacPrivateInterface = new ClrDataProcess(this, pUnk);
 }
Beispiel #5
0
 internal DacLibrary(IntPtr pUnk)
 {
     InternalDacPrivateInterface = new ClrDataProcess(this, pUnk);
 }