public override void AnalyzeFrame(SDThread thread, SDCombinedStackFrame frame) { if (frame.MethodName == null) { return; } if (ContainsAny(frame.MethodName, "Thread::WaitSuspendEvents")) { frame.Tags.Add(SDTag.ClrThreadSuspend); thread.Tags.Add(SDTag.ClrThreadSuspend); } if (ContainsAny(frame.MethodName, "GCHeap::WaitUntilGCComplete") || ContainsAny(frame.MethodName, "SVR::gc_heap::wait_for_gc_done")) { frame.Tags.Add(SDTag.ClrWaitForGc); thread.Tags.Add(SDTag.ClrWaitForGc); } if (ContainsAny(frame.MethodName, "gc_heap::gc_thread_stub")) { frame.Tags.Add(SDTag.ClrGcThread); thread.Tags.Add(SDTag.ClrGcThread); } if (ContainsAny(frame.MethodName, "_CrtDbgReport")) { frame.Tags.Add(SDTag.AssertionErrorTag); thread.Tags.Add(SDTag.AssertionErrorTag); } }
public override void AnalyzeFrame(SDThread thread, SDCombinedStackFrame frame) { if (frame.MethodName == null) { return; } AddTagIfFrameContains(thread, frame, x => ContainsAny(frame.MethodName, "exception"), SDTag.ExceptionInStackTag); bool hasAddedSpecialAgentTag = false; hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsPhpAgentModule, SDTag.DynatracePhpAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsJavaAgentModule, SDTag.DynatraceJavaAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsDotnetAgentModule, SDTag.DynatraceDotNetAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsProcessAgentModule, SDTag.DynatraceProcessAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsIisAgentModule, SDTag.DynatraceIisAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsLogAgentModule, SDTag.DynatraceLogAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsOsAgentModule, SDTag.DynatraceOsAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsPluginAgentModule, SDTag.DynatracePluginAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsNetworkAgentModule, SDTag.DynatraceNetworkAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsNginxAgentModule, SDTag.DynatraceNginxAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsVarnishAgentModule, SDTag.DynatraceVarnishAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsWatchdogFrame, SDTag.DynatraceWatchdogTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsNodeAgentModule, SDTag.DynatraceNodeAgentTag); hasAddedSpecialAgentTag |= AddTagIfFrameContains(thread, frame, ContainsAgentLoaderModule, SDTag.DynatraceAgentLoaderTag); if (!hasAddedSpecialAgentTag) { // if no special agent has been detected, add generic dynatrace agent tag AddTagIfFrameContains(thread, frame, ContainsDynatraceModule, SDTag.DynatraceAgentTag); } }
public override void AnalyzeFrame(SDThread thread, SDCombinedStackFrame frame) { if (IsNativeExceptionMethodFrame(frame)) { frame.Tags.Add(SDTag.NativeExceptionTag); thread.Tags.Add(SDTag.NativeExceptionTag); } }
private bool IsDynatraceAgentFrame(SDCombinedStackFrame frame) { return(ContainsAny(frame.ModuleName + frame.Type.ToString() + frame.MethodName, "oneagent", "dtagent", "ruxitagent", "dtiisagent", "dtapacheagent" )); }
/// <summary> /// if <paramref name="func"/> returns true, set <paramref name="tag"/> on frame and thread /// </summary> private bool AddFrameAndThreadTagIf(SDThread thread, SDCombinedStackFrame frame, Func <bool> func, SDTag tag) { if (!func()) { return(false); } frame.Tags.Add(tag); thread.Tags.Add(tag); return(true); }
/// <summary> /// if <paramref name="func"/> returns true, set <paramref name="tag"/> on frame and thread /// </summary> private bool AddTagIfFrameContains(SDThread thread, SDCombinedStackFrame frame, Func <string, bool> func, SDTag tag) { if (!func(frame.ModuleName + frame.Type.ToString() + frame.MethodName)) { return(false); } frame.Tags.Add(tag); thread.Tags.Add(tag); return(true); }
public override void AnalyzeFrame(SDThread thread, SDCombinedStackFrame frame) { AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "_purecall", SDTag.PureCallTag); AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "abort", SDTag.AbortTag); AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "__CxxCallCatchBlock", SDTag.ExceptionCatchTag); AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "RcCosolidateFrames", SDTag.ExceptionCatchTag); AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "RtlRaiseException", SDTag.NativeExceptionTag); AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "RtlReportException", SDTag.NativeExceptionTag); AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "__report_gsfailure", SDTag.BufferOverrunTag); AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "__chkstk", SDTag.StackOverflowTag); }
private bool IsNativeExceptionMethodFrame(SDCombinedStackFrame frame) { return(ContainsAny(frame.Type.ToString() + frame.MethodName, "KiUserExceptionDispatcher", "KiUserExceptionDispatch", "RtlRaiseException", "RtlReportException", "RaiseException", "RaiseFailFastException", "UnhandledExceptionFilter", "DbgBreakPoint" )); }
public override void AnalyzeFrame(SDThread thread, SDCombinedStackFrame frame) { if (IsExceptionFrame(frame)) { frame.Tags.Add(SDTag.ExceptionInStackTag); thread.Tags.Add(SDTag.ExceptionInStackTag); } if (IsDynatraceAgentFrame(frame)) { frame.Tags.Add(SDTag.DynatraceAgentTag); thread.Tags.Add(SDTag.DynatraceAgentTag); } }
/// <summary> /// gets stack traces for each thread /// </summary> private void GetCombinedStackTraces() { // get stacktrace of each thread // ((IDebugSymbols2)this.debugClient).SetSymbolOptions(SYMOPT.LOAD_ANYTHING); foreach (SDThread thread in this.threads.Values) { var trace = new CombinedStackTrace(thread.EngineId, thread.OsId, thread.IsManagedThread, this.debugClient, this.context); // wrap to SDCombinedStackTrace IList <SDCombinedStackFrame> t = new List <SDCombinedStackFrame>(); ulong lastStackPtr = 0; int i = 0; foreach (CombinedStackFrame frame in trace) { ulong stackPtrOffset; if (lastStackPtr == 0) { stackPtrOffset = 0; // think about diffing with rsp register } else { stackPtrOffset = frame.StackPointer - lastStackPtr; } var newFrame = new SDCombinedStackFrame(frame.Type, frame.ModuleName, frame.MethodName, frame.OffsetInMethod, frame.InstructionPointer, frame.StackPointer, frame.ReturnOffset, stackPtrOffset, frame.SourceInfo); if (frame.LinkedStackFrame != null) { newFrame.LinkedStackFrame = new SDCombinedStackFrame(frame.LinkedStackFrame.Type, frame.LinkedStackFrame.ModuleName, frame.LinkedStackFrame.MethodName, frame.LinkedStackFrame.OffsetInMethod, frame.LinkedStackFrame.InstructionPointer, frame.LinkedStackFrame.StackPointer, frame.LinkedStackFrame.ReturnOffset, stackPtrOffset, frame.SourceInfo); } lastStackPtr = frame.StackPointer; t.Add(newFrame); i++; } thread.StackTrace = new SDCombinedStackTrace(t); } }
private async Task AddSourceInfoAsync(SDCombinedStackFrame stackFrame, SDCDModule module) { Tuple <SDFileAndLineNumber, string> methodSource = await Address2MethodSourceAsync(stackFrame.InstructionPointer, module); SDFileAndLineNumber sourceInfo = methodSource.Item1; string methodName = methodSource.Item2; if (methodName != "??") { stackFrame.MethodName = methodName; if (sourceInfo.File != null && sourceInfo.File != "??") { stackFrame.SourceInfo = sourceInfo; } } }
public override void AnalyzeFrame(SDThread thread, SDCombinedStackFrame frame) { AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "_purecall", SDTag.PureCallTag); AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "abort", SDTag.AbortTag); }
private static bool FrameEquals(SDCombinedStackFrame frameA, SDCombinedStackFrame frameB) { return(EqualsIgnoreNonAscii(frameA.ModuleName, frameB.ModuleName) && EqualsIgnoreNonAscii(frameA.MethodName, frameB.MethodName)); }
public virtual void AnalyzeFrame(SDThread thread, SDCombinedStackFrame frame) { }
private bool IsNativeExceptionMethodFrame(SDCombinedStackFrame frame) { return(frame.ModuleName.StartsWith("libc") && ContainsAny(frame.MethodName, "gsignal", "abort", "raise")); }
private bool IsExceptionFrame(SDCombinedStackFrame frame) { return(ContainsAny(frame.MethodName, "exception")); }
/// <summary> /// return true, if frame name contains any of the <paramref name="names"/> /// </summary> private bool FrameContainsName(SDCombinedStackFrame frame, params string[] names) { return(ContainsAny(frame.ModuleName + frame.Type.ToString() + frame.MethodName, names)); }