{
public class ParallelStack
{
- public static ParallelStack Build(ClrRuntime runtime)
+ public static ParallelStack Build(ClrRuntime runtime, bool includeRuntimeStacks)
{
ParallelStack ps = new();
List<ClrStackFrame> stackFrames = new(64);
stackFrames.Clear();
foreach (ClrStackFrame stackFrame in thread.EnumerateStackTrace().Reverse())
{
- if ((stackFrame.Kind != ClrStackFrameKind.ManagedMethod) || (stackFrame.Method == null))
+ bool shouldAdd =
+ stackFrame.Kind == ClrStackFrameKind.ManagedMethod
+ || (includeRuntimeStacks && stackFrame.Kind == ClrStackFrameKind.Runtime);
+
+ if ((!shouldAdd) || (stackFrame.Method == null))
{
continue;
}
return ps;
}
- public static ParallelStack Build(string dumpFile, string dacFilePath)
+ public static ParallelStack Build(string dumpFile, string dacFilePath, bool includeRuntimeStacks)
{
DataTarget dataTarget = null;
ParallelStack ps = null;
return null;
}
- ps = ParallelStack.Build(runtime);
+ ps = ParallelStack.Build(runtime, includeRuntimeStacks);
}
finally
{
return ps;
}
- public static ParallelStack Build(int pid, string dacFilePath)
+ public static ParallelStack Build(int pid, string dacFilePath, bool includeRuntimeStacks)
{
DataTarget dataTarget = null;
ParallelStack ps = null;
return null;
}
- ps = ParallelStack.Build(runtime);
+ ps = ParallelStack.Build(runtime, includeRuntimeStacks);
}
finally
{
[Option(Name = "--allthreads", Aliases = new string[] { "-a" }, Help = "Displays all threads per group instead of at most 4 by default.")]
public bool AllThreads { get; set; }
+ [Option(Name = "--runtime", Aliases = new string[] { "-r" }, Help = "Displays runtime stacks in addition to managed ones.")]
+ public bool IncludeRuntimeStacks { get; set; }
+
public override void Invoke()
{
- ParallelStack ps = ParallelStack.Build(Runtime);
+ ParallelStack ps = ParallelStack.Build(Runtime, IncludeRuntimeStacks);
if (ps == null)
{
return;