gpt4 book ai didi

c# - 有没有办法在 c# 中获取所有线程的堆栈跟踪,比如 java.lang.Thread.getAllStackTraces()?

转载 作者:太空狗 更新时间:2023-10-29 21:24:55 28 4
gpt4 key购买 nike

在 Java 中,可以获得所有正在运行的线程的堆栈跟踪的快照。这是用 java.lang.Thread.getAllStackTraces() 完成的(它返回 Map<Thread,StackTraceElement[]> )。

如何使用 .net 完成此操作?

最佳答案

所以我实际上只需要弄清楚如何做到这一点——还没有在生产中广泛使用这个解决方案,但是有一个相对较新的库,叫做 ClrMd。

http://blogs.msdn.com/b/dougste/archive/2013/05/04/clrmd-net-crash-dump-and-live-process-inspection.aspx

使用它,我能够附加到我自己的进程并获取所有事件线程的堆栈跟踪。在重新启动我们的应用程序之前检测到死锁时使用它,如下所示:

var result = new Dictionary<int, string[]>();

var pid = Process.GetCurrentProcess().Id;

using (var dataTarget = DataTarget.AttachToProcess(pid, 5000, AttachFlag.Passive))
{
ClrInfo runtimeInfo = dataTarget.ClrVersions[0];
var runtime = runtimeInfo.CreateRuntime();

foreach (var t in runtime.Threads)
{
result.Add(
t.ManagedThreadId,
t.StackTrace.Select(f =>
{
if (f.Method != null)
{
return f.Method.Type.Name + "." + f.Method.Name;
}

return null;
}).ToArray()
);
}
}

var json = JsonConvert.SerializeObject(result);

zip.AddEntry("_threads.json", json);

让它在同一个进程中工作的真正重要的事情是 AttachFlag.Passive

如果您只是执行 DataTarget.AttachToProcess(pid, 5000),它会执行“侵入式”附加,尝试暂停进程。当您尝试附加到您自己的进程时,这会引发异常,我假设是因为您无法在尝试从您的应用程序或类似的东西附加时暂停您的应用程序。

关于c# - 有没有办法在 c# 中获取所有线程的堆栈跟踪,比如 java.lang.Thread.getAllStackTraces()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4867500/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com