private static bool DumpStackTraces()

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;
        }