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

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

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

var result = new Dictionary();

var pid = Process.GetCurrentProcess().Id;

using (var dataTarget = DataTarget.AttachToProcess(pid, 5000, AttachFlag.Passive))

{

string dacLocation = dataTarget.ClrVersions[0].TryGetDacLocation();

var runtime = dataTarget.CreateRuntime(dacLocation);

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),它会做一个“侵入性”附加,试图暂停进程。当您尝试附加到自己的进程时,这将抛出异常,我假设因为您尝试从应用程序附加或类似的东西而暂停应用程序。

无论如何,是的,很酷的东西。

如果任何人有任何理由为什么这是超级天真或任何东西,pleeeeease指出他们。没有在生产中使用它(只是放在第一个实例),所以希望它的工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值