public DacLibrary(DataTargetImpl dataTarget, string dacDll) { if (dataTarget.ClrVersions.Count == 0) { throw new ClrDiagnosticsException(String.Format("Process is not a CLR process!")); } _library = NativeMethods.LoadLibrary(dacDll); if (_library == IntPtr.Zero) { throw new ClrDiagnosticsException("Failed to load dac: " + dacDll); } IntPtr addr = NativeMethods.GetProcAddress(_library, "CLRDataCreateInstance"); _dacDataTarget = new DacDataTarget(dataTarget); object obj; NativeMethods.CreateDacInstance func = (NativeMethods.CreateDacInstance)Marshal.GetDelegateForFunctionPointer(addr, typeof(NativeMethods.CreateDacInstance)); Guid guid = new Guid("5c552ab6-fc09-4cb3-8e36-22fa03c798b7"); int res = func(ref guid, _dacDataTarget, out obj); if (res == 0) { _dac = obj as IXCLRDataProcess; } if (_dac == null) { throw new ClrDiagnosticsException("Failure loading DAC: CreateDacInstance failed 0x" + res.ToString("x"), ClrDiagnosticsException.HR.DacError); } }
public RuntimeBase(ClrInfo info, DataTargetImpl dataTarget, DacLibrary lib) { Debug.Assert(lib != null); Debug.Assert(lib.DacInterface != null); ClrInfo = info; _dataTarget = dataTarget; _library = lib; _dacInterface = _library.DacInterface; InitApi(); _dacInterface.Flush(); IGCInfo data = GetGCInfo(); if (data == null) { throw new ClrDiagnosticsException("This runtime is not initialized and contains no data.", ClrDiagnosticsException.HR.RuntimeUninitialized); } ServerGC = data.ServerMode; HeapCount = data.HeapCount; CanWalkHeap = data.GCStructuresValid && !dataTarget.DataReader.IsMinidump; _dataReader = dataTarget.DataReader; }
public DacLibrary(DataTargetImpl dataTarget, object ix) { _dac = ix as IXCLRDataProcess; if (_dac == null) { throw new ArgumentException("clrDataProcess not an instance of IXCLRDataProcess"); } }
private void ProcessStackWalk(uint osThreadId) { IXCLRDataProcess ixclrDataProcess = _context.Runtime.DacInterface; object tmp; HR.Verify(ixclrDataProcess.GetTaskByOSThreadID(osThreadId, out tmp)); IXCLRDataTask task = (IXCLRDataTask)tmp; HR.Verify(task.CreateStackWalk(0xf /*all flags*/, out tmp)); IXCLRDataStackWalk stackWalk = (IXCLRDataStackWalk)tmp; while (HR.S_OK == stackWalk.Next()) { ProcessFrame(stackWalk); } }
public RuntimeBase(ClrInfo info, DataTargetImpl dataTarget, DacLibrary lib) { Debug.Assert(lib != null); Debug.Assert(lib.DacInterface != null); ClrInfo = info; _dataTarget = dataTarget; _library = lib; _dacInterface = _library.DacInterface; InitApi(); _dacInterface.Flush(); IGCInfo data = GetGCInfo(); if (data != null) { ServerGC = data.ServerMode; HeapCount = data.HeapCount; CanWalkHeap = data.GCStructuresValid; } _dataReader = dataTarget.DataReader; }
public DacLibrary(DataTargetImpl dataTarget, string dacDll) { if (dataTarget.ClrVersions.Count == 0) throw new ClrDiagnosticsException(String.Format("Process is not a CLR process!")); _library = NativeMethods.LoadLibrary(dacDll); if (_library == IntPtr.Zero) throw new ClrDiagnosticsException("Failed to load dac: " + dacDll); IntPtr addr = NativeMethods.GetProcAddress(_library, "CLRDataCreateInstance"); _dacDataTarget = new DacDataTarget(dataTarget); object obj; NativeMethods.CreateDacInstance func = (NativeMethods.CreateDacInstance)Marshal.GetDelegateForFunctionPointer(addr, typeof(NativeMethods.CreateDacInstance)); Guid guid = new Guid("5c552ab6-fc09-4cb3-8e36-22fa03c798b7"); int res = func(ref guid, _dacDataTarget, out obj); if (res == 0) _dac = obj as IXCLRDataProcess; if (_dac == null) throw new ClrDiagnosticsException("Failure loading DAC: CreateDacInstance failed 0x" + res.ToString("x"), ClrDiagnosticsException.HR.DacError); }
public DacLibrary(DataTargetImpl dataTarget, object ix) { _dac = ix as IXCLRDataProcess; if (_dac == null) throw new ArgumentException("clrDataProcess not an instance of IXCLRDataProcess"); }
internal IEnumerable <ClrStackFrame> EnumerateStackFrames(DesktopThread thread) { IXCLRDataProcess proc = GetClrDataProcess(); object tmp; int res = proc.GetTaskByOSThreadID(thread.OSThreadId, out tmp); if (res < 0) { yield break; } IXCLRDataTask task = null; IXCLRDataStackWalk stackwalk = null; try { task = (IXCLRDataTask)tmp; res = task.CreateStackWalk(0xf, out tmp); if (res < 0) { yield break; } stackwalk = (IXCLRDataStackWalk)tmp; byte[] ulongBuffer = new byte[8]; byte[] context = ContextHelper.Context; do { uint size; res = stackwalk.GetContext(ContextHelper.ContextFlags, ContextHelper.Length, out size, context); if (res < 0 || res == 1) { break; } ulong ip = BitConverter.ToUInt32(context, ContextHelper.InstructionPointerOffset); ulong sp = BitConverter.ToUInt32(context, ContextHelper.StackPointerOffset); res = stackwalk.Request(0xf0000000, 0, null, (uint)ulongBuffer.Length, ulongBuffer); ulong frameVtbl = 0; if (res >= 0) { frameVtbl = BitConverter.ToUInt64(ulongBuffer, 0); if (frameVtbl != 0) { sp = frameVtbl; ReadPointer(sp, out frameVtbl); } } DesktopStackFrame frame = GetStackFrame(thread, res, ip, sp, frameVtbl); yield return(frame); } while (stackwalk.Next() == 0); } finally { if (task != null) { Marshal.FinalReleaseComObject(task); } if (stackwalk != null) { Marshal.FinalReleaseComObject(stackwalk); } } }