Пример #1
0
        public void Init()
        {
            filesystem     = new Mock <IFilesystem>();
            processHandler = new ProcessHandlerDouble();
            analysisResult = new SDResult();
            var coredump = new Mock <IFileInfo>();

            coredump.Setup(c => c.FullName).Returns(PATH + "dump.core");
            analysis = new GdbAnalyzer(filesystem.Object, processHandler, coredump.Object, analysisResult);

            this.analysisResult.ThreadInformation = new Dictionary <uint, SDThread>();
            SDThread thread = new SDThread();
            var      frames = new List <SDCombinedStackFrame> {
                new SDCDCombinedStackFrame("module", "method", 0, 0, 0, 0, 0, null)
            };

            thread.StackTrace = new SDCombinedStackTrace(frames);
            this.analysisResult.ThreadInformation.Add(0, thread);
            SDCDSystemContext context = new SDCDSystemContext()
            {
                FileName = PATH + "my-executable"
            };

            analysisResult.SystemContext = context;
        }
Пример #2
0
 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);
     }
 }
Пример #3
0
        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);
            }
        }
Пример #4
0
        private void UnwindCurrentThread(SDCDSystemContext context, SDThread thread)
        {
            var frames = new List <SDCombinedStackFrame>();

            ulong  ip, oldIp = 0, sp, oldSp = 0, offset, oldOffset = 0;
            string procName, oldProcName = null;
            int    nFrames = 0;

            do
            {
                ip       = getInstructionPointer();
                sp       = getStackPointer();
                procName = getProcedureName();
                offset   = getProcedureOffset();

                if (oldProcName != null)
                {
                    frames.Add(new SDCDCombinedStackFrame("", oldProcName, oldOffset, oldIp, oldSp, ip, 0, null));
                }
                oldIp       = ip;
                oldSp       = sp;
                oldOffset   = offset;
                oldProcName = procName;
            } while (!step() && ++nFrames < MAX_FRAMES);

            thread.StackTrace = new SDCombinedStackTrace(frames);
        }
Пример #5
0
 public override void AnalyzeThread(SDThread thread)
 {
     if (thread.LastException != null)
     {
         thread.Tags.Add(SDTag.ManagedExceptionTag);
     }
 }
Пример #6
0
 public override void AnalyzeFrame(SDThread thread, SDCombinedStackFrame frame)
 {
     if (IsNativeExceptionMethodFrame(frame))
     {
         frame.Tags.Add(SDTag.NativeExceptionTag);
         thread.Tags.Add(SDTag.NativeExceptionTag);
     }
 }
Пример #7
0
        private void PrepareSampleThread(ulong instrPtr)
        {
            result.ThreadInformation = new Dictionary <uint, SDThread>();
            SDThread thread = new SDThread(1);
            IList <SDCombinedStackFrame> stackFrames = new List <SDCombinedStackFrame>();

            stackFrames.Add(new SDCombinedStackFrame(StackFrameType.Native, DEFAULT_MODULE_NAME, DEFAULT_METHOD_NAME, 42, instrPtr, 42, 42, null, 42, null));
            thread.StackTrace = new SDCombinedStackTrace(stackFrames);
            result.ThreadInformation.Add(1, thread);
        }
Пример #8
0
 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);
 }
Пример #9
0
        /// <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);
        }
Пример #10
0
        /// <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);
        }
Пример #11
0
 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);
     }
 }
Пример #12
0
        public static string ToText(this SDThread thread)
        {
            if (thread == null)
            {
                return(string.Empty);
            }
            var sb = new StringBuilder();

            foreach (var frame in thread.StackTrace)
            {
                sb.AppendLine(frame.ToString());
            }
            return(sb.ToString());
        }
        public void ThreadSerializationTest()
        {
            ThreadAnalyzer analyzer = new ThreadAnalyzer(context);

            Assert.IsNotNull(analyzer.threads);

            foreach (var key in analyzer.threads.Keys)
            {
                SDThread t = analyzer.threads[key];
                Assert.AreEqual(t.OsId, key);                 // should be the same, as threads are inserted in the dictionary with their OS id

                string json = t.StackTrace.SerializeToJSON();
                SDCombinedStackTrace trace = JsonConvert.DeserializeObject <SDCombinedStackTrace>(json);

                Assert.IsNotNull(trace);
                Assert.IsTrue(Enumerable.SequenceEqual(t.StackTrace, trace));
            }
        }
Пример #14
0
 public void PrintStackTrace(SDThread thread)
 {
     context.WriteInfo("Thread CLR ID: {0}, OS ID: {1:X}, State: {2}, IsThreadPoolThread: {3}, {4}", thread.EngineId, thread.OsId, thread.State, thread.IsThreadPoolThread, TagAnalyzer.TagsAsString("Tags: ", thread.Tags));
     foreach (SDCombinedStackFrame frame in thread.StackTrace)
     {
         if (frame.Type == StackFrameType.Special)
         {
             context.WriteLine("{0,-10} {1,-20:x16} {2}", "Special", frame.InstructionPointer, "[" + frame.MethodName + "]");
         }
         else
         {
             context.WriteLine("{0,-10} {1,-20:x16} {2}!{3}+0x{4:x}",
                               frame.Type,
                               frame.InstructionPointer,
                               frame.ModuleName,
                               frame.MethodName,
                               frame.OffsetInMethod);
             Console.ResetColor();
         }
     }
     context.WriteInfo("-- end call stack (thread {0}) --\n", thread.OsId);
 }
Пример #15
0
        /// <summary>
        /// Inits the thread dictionary with OS ID and engine ID of every thread,
        /// and also refs managed thread if there is one for each thread in the process dump
        /// </summary>
        private void InitAllThreadIds()
        {
            // get amount of threads in the process
            Utility.CheckHRESULT(((IDebugSystemObjects)this.debugClient).GetNumberThreads(out numberOfThreads));

            for (uint i = 0; i < numberOfThreads; i++)
            {
                var engineThreadIds = new uint[1];             // has to be array, see IDebugSystemObjects.GetThreadIdsByIndex
                var osThreadIds     = new uint[1];             // same here

                // get the engine id(s) and also the os id(s) of each thread
                Utility.CheckHRESULT(((IDebugSystemObjects)this.debugClient).GetThreadIdsByIndex(i, 1, engineThreadIds, osThreadIds));

                // create new SDThread object and add it to the dictionary
                var t = new SDThread(i);
                t.OsId     = osThreadIds[0];
                t.EngineId = engineThreadIds[0];

                ClrThread managedThread = null;
                if (context.Runtime != null)
                {
                    managedThread = context.Runtime.Threads.FirstOrDefault(thread => thread.OSThreadId == t.OsId);
                    if (managedThread != null)
                    {
                        t.IsManagedThread    = true;
                        t.ManagedThreadId    = managedThread.ManagedThreadId;
                        t.State              = managedThread.SpecialDescription();
                        t.IsThreadPoolThread = managedThread.IsThreadPoolThread();
                    }
                    else
                    {
                        t.IsManagedThread = false;
                    }
                }

                this.threads.Add(t.OsId, t);
            }
        }
Пример #16
0
        public void ThreadAnalyzerStacktraceTest()
        {
            ThreadAnalyzer analyzer = new ThreadAnalyzer(context);

            // pick any thread stacktrace, in this case take thread 932, os id = 27484
            SDThread thread = analyzer.threads[27484];

            Assert.IsNotNull(thread);

            IList <string> trace = ReadTraceFromThread932();

            Assert.AreEqual(trace.Count, thread.StackTrace.Count);

            for (int i = 0; i < trace.Count; i++)
            {
                var values = trace[i].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                if (values.Length > 0)
                {
                    string method = values[2];                     // method name after SP and IP
                    StringAssert.Equals(thread.StackTrace[i].MethodName, method);
                }
            }
        }
Пример #17
0
 public override void AnalyzeFrame(SDThread thread, SDCombinedStackFrame frame)
 {
     AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "_purecall", SDTag.PureCallTag);
     AddFrameAndThreadTagIf(thread, frame, () => frame.MethodName == "abort", SDTag.AbortTag);
 }
Пример #18
0
        public async Task <string> GetMessage(DumpMetainfo dumpInfo)
        {
            var model = new SlackMessageViewModel();

            var res = dumpRepo.GetResult(dumpInfo.BundleId, dumpInfo.DumpId, out string error);

            var engine = new EngineFactory().ForEmbeddedResources(typeof(SlackMessageViewModel));

            model.TopProperties.Add(dumpInfo.DumpType == DumpType.WindowsDump ? "Windows" : "Linux");
            model.DumpFilename = Path.GetFileName(dumpInfo.DumpFileName);
            model.Url          = $"{superDumpUrl}/Home/Report?bundleId={dumpInfo.BundleId}&dumpId={dumpInfo.DumpId}";
            if (res != null)
            {
                model.TopProperties.Add(res.SystemContext.ProcessArchitecture);

                if (res.IsManagedProcess)
                {
                    model.TopProperties.Add(".NET");
                }
                if (res.SystemContext.Modules.Any(x => x.FileName.Contains("jvm.dll")))
                {
                    model.TopProperties.Add("Java");
                }
                if (res.SystemContext.Modules.Any(x => x.FileName.Contains("jvm.so")))
                {
                    model.TopProperties.Add("Java");
                }
                if (res.SystemContext.Modules.Any(x => x.FileName.Contains("iiscore.dll")))
                {
                    model.TopProperties.Add("IIS");
                }
                if (res.SystemContext.Modules.Any(x => x.FileName.Contains("nginx.so")))
                {
                    model.TopProperties.Add("NGINX");
                }
                if (res.SystemContext.Modules.Any(x => x.FileName.Contains("httpd/modules")))
                {
                    model.TopProperties.Add("Apache");
                }
                if (res.SystemContext.Modules.Any(x => x.FileName.Contains("node.exe")))
                {
                    model.TopProperties.Add("Node.js");
                }

                var agentModules = res.SystemContext.Modules.Where(x => x.Tags.Any(t => t.Equals(SDTag.DynatraceAgentTag))).Select(m => m.ToString());
                model.AgentModules = agentModules.ToList();

                model.NumManagedExceptions = res.ThreadInformation.Count(x => x.Value.Tags.Any(t => t.Equals(SDTag.ManagedExceptionTag)));
                model.NumNativeExceptions  = res.ThreadInformation.Count(x => x.Value.Tags.Any(t => t.Equals(SDTag.NativeExceptionTag)));
                model.NumAssertErrors      = res.ThreadInformation.Count(x => x.Value.Tags.Any(t => t.Equals(SDTag.AssertionErrorTag)));

                SDThread       managedExceptionThread = res.ThreadInformation.Values.FirstOrDefault(x => x.Tags.Any(t => t.Equals(SDTag.ManagedExceptionTag)));
                SDClrException clrException           = managedExceptionThread?.LastException;
                if (clrException != null)
                {
                    model.TopException = clrException.Type;
                    model.Stacktrace   = clrException.StackTrace.ToString();
                }

                if (res.LastEvent != null && !res.LastEvent.Description.Contains("Break instruction"))                   // break instruction events are useless
                {
                    model.LastEvent = $"{res.LastEvent.Type}: {res.LastEvent.Description}";
                }
            }

            return(await engine.CompileRenderAsync("SlackMessage", model));
        }
Пример #19
0
 public virtual void AnalyzeFrame(SDThread thread, SDCombinedStackFrame frame)
 {
 }
Пример #20
0
        private Dictionary <uint, SDThread> UnwindThreads(SDCDSystemContext context)
        {
            var threads = new Dictionary <uint, SDThread>();

            int nThreads = getNumberOfThreads();

            for (uint i = 0; i < nThreads; i++)
            {
                selectThread(i);
                SDThread thread = new SDThread()
                {
                    EngineId = i,
                    OsId     = i,
                    Index    = i
                };
                UnwindCurrentThread(context, thread);
                threads.Add(i, thread);
            }

            bool foundLastExecuted = false;

            for (int i = 0; i < nThreads; i++)
            {
                int signal = getSignalNumber(i);
                if (signal == -1)
                {
                    continue;
                }
                if (signal < 32 && signal != 19)
                {
                    if (foundLastExecuted)
                    {
                        Console.WriteLine("Already found the last executed thread which was: " + analysisResult.LastExecutedThread + ". New one is " + i);
                    }
                    foundLastExecuted = true;
                    analysisResult.LastExecutedThread = (uint)i;
                    analysisResult.LastEvent          = new SDLastEvent()
                    {
                        ThreadId    = (uint)i,
                        Type        = signal.ToString(),
                        Description = SignalNoToCode(signal)
                    };
                    if (signal == 4 || signal == 8)
                    {
                        analysisResult.LastEvent.Description += ": Faulty instruction at address " + getSignalAddress(i);
                    }
                    else if (signal == 11)
                    {
                        analysisResult.LastEvent.Description += ": Invalid memory reference to address 0x" + getSignalAddress(i).ToString("X");
                    }
                    else
                    {
                        int error = getSignalErrorNo(i);
                        if (error != 0)
                        {
                            analysisResult.LastEvent.Description += " (error number " + error + ")";
                        }
                    }
                }
            }
            return(threads);
        }
Пример #21
0
 public virtual void AnalyzeThread(SDThread thread)
 {
 }