in src/Program.cs [198:245]
private static bool DumpStackTraces(ThreadDumpParameters parameters)
{
DataTarget target = null;
var success = true;
var output = new StringBuilder();
using (WithTimeoutCookie(parameters.TimeoutMs, () => target?.Dispose()))
{
try
{
using (target = AttachToProcess(parameters))
{
var clrVersion = target.ClrVersions.FirstOrDefault() ?? throw new Exception("CLR not found in process");
using (var runtime = clrVersion.CreateRuntime())
{
foreach (var clrThread in runtime.Threads)
{
if (!clrThread.IsAlive)
continue;
output.AppendLine($"Thread #{clrThread.ManagedThreadId}:");
foreach (var frame in clrThread.EnumerateStackTrace())
output.AppendLine($"\tat {frame}");
}
}
}
}
catch (Exception ex)
{
success = false;
output.AppendLine($"Cannot capture stack trace from process[{parameters.Pid}]. Error: {ex.Message}");
}
}
if (string.IsNullOrEmpty(parameters.ThreadDumpDir))
{
Console.Write(output.ToString());
}
else
{
var fileName = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss.fff}.tdump";
var path = Path.Combine(parameters.ThreadDumpDir, fileName);
File.WriteAllText(path, output.ToString(), Encoding.UTF8);
}
return success;
}