/// <summary> /// Build a callstack pattern for a crash to ease bucketing of crashes into Buggs. /// </summary> /// <param name="CrashInstance">A crash that was recently added to the database.</param> public void BuildPattern(Crash CrashInstance) { List <string> Pattern = new List <string>(); // Get an array of callstack items CallStackContainer CallStack = new CallStackContainer(CrashInstance); CallStack.bDisplayFunctionNames = true; if (CrashInstance.Pattern == null) { // Set the module based on the modules in the callstack CrashInstance.Module = CallStack.GetModuleName(); try { foreach (CallStackEntry Entry in CallStack.CallStackEntries) { FunctionCall CurrentFunctionCall = new FunctionCall(); if (FunctionCalls.Where(f => f.Call == Entry.FunctionName).Count() > 0) { CurrentFunctionCall = FunctionCalls.Where(f => f.Call == Entry.FunctionName).First(); } else { CurrentFunctionCall = new FunctionCall(); CurrentFunctionCall.Call = Entry.FunctionName; FunctionCalls.InsertOnSubmit(CurrentFunctionCall); } int Count = Crash_FunctionCalls.Where(c => c.CrashId == CrashInstance.Id && c.FunctionCallId == CurrentFunctionCall.Id).Count(); if (Count < 1) { Crash_FunctionCall JoinTable = new Crash_FunctionCall(); JoinTable.Crash = CrashInstance; JoinTable.FunctionCall = CurrentFunctionCall; Crash_FunctionCalls.InsertOnSubmit(JoinTable); } SubmitChanges(); Pattern.Add(CurrentFunctionCall.Id.ToString()); } CrashInstance.Pattern = string.Join("+", Pattern); SubmitChanges(); } catch (Exception Ex) { Debug.WriteLine("Exception in BuildPattern: " + Ex.ToString()); } } }
/// <summary> /// Build a callstack pattern for a crash to ease bucketing of crashes into Buggs. /// </summary> /// <param name="CrashInstance">A crash that was recently added to the database.</param> public void BuildPattern(Crash CrashInstance) { using (FAutoScopedLogTimer LogTimer = new FAutoScopedLogTimer(this.GetType().ToString() + "(Crash=" + CrashInstance.Id + ")")) { List <string> Pattern = new List <string>(); // Get an array of callstack items CallStackContainer CallStack = new CallStackContainer(CrashInstance); CallStack.bDisplayFunctionNames = true; if (CrashInstance.Pattern == null) { // Set the module based on the modules in the callstack CrashInstance.Module = CallStack.GetModuleName(); try { foreach (CallStackEntry Entry in CallStack.CallStackEntries) { FunctionCall CurrentFunctionCall = new FunctionCall(); if (FunctionCalls.Where(f => f.Call == Entry.FunctionName).Count() > 0) { CurrentFunctionCall = FunctionCalls.Where(f => f.Call == Entry.FunctionName).First(); } else { CurrentFunctionCall = new FunctionCall(); CurrentFunctionCall.Call = Entry.FunctionName; FunctionCalls.InsertOnSubmit(CurrentFunctionCall); } SubmitChanges(); Pattern.Add(CurrentFunctionCall.Id.ToString()); } //CrashInstance.Pattern = "+"; CrashInstance.Pattern = string.Join("+", Pattern); // We need something like this +1+2+3+5+ for searching for exact pattern like +5+ //CrashInstance.Pattern += "+"; SubmitChanges(); } catch (Exception Ex) { FLogger.WriteException("BuildPattern: " + Ex.ToString()); } } } }