/// <summary> /// New the specified prefix and logThreadsWithoutStackTrace. /// </summary> /// <returns>The new.</returns> /// <param name="prefix">Prefix.</param> /// <param name="logThreadsWithoutStackTrace">If set to <c>true</c> log threads without stack trace.</param> public static ANRError New(long duration, string prefix, bool logThreadsWithoutStackTrace) { var mainThread = Looper.MainLooper.Thread; var threadComparer = new _StackTraceComparer(mainThread); var stackTraces = new Dictionary <Thread, StackTraceElement[]>(threadComparer); foreach (var entry in Thread.AllStackTraces) { if (entry.Key == mainThread || (entry.Key.Name.StartsWith(prefix, StringComparison.Ordinal) && (logThreadsWithoutStackTrace || entry.Value.Length > 0))) { stackTraces.Add(entry.Key, entry.Value); } } // Sometimes main is not returned in Thread.AllStackTraces - ensure that we list it if (!stackTraces.ContainsKey(mainThread)) { stackTraces.Add(mainThread, mainThread.GetStackTrace()); } _ThreadTrace._Thread tst = null; foreach (var entry in stackTraces) { var tt = new _ThreadTrace(GetThreadTitle(entry.Key), entry.Value); tst = new _ThreadTrace._Thread(tst); } return(new ANRError(tst, duration)); }
/// <summary> /// News the main only. /// </summary> /// <returns>The main only.</returns> public static ANRError NewMainOnly(long duration) { var mainThread = Looper.MainLooper.Thread; var mainStackTrace = mainThread.GetStackTrace(); var tt = new _ThreadTrace(GetThreadTitle(mainThread), mainStackTrace); var tst = new _ThreadTrace._Thread(null); return(new ANRError(tst, duration)); }
private ANRError(_ThreadTrace._Thread st, long duration) : base("Application Not Responding", st) { Duration = duration; }