如何在Linux上调试哪个线程在.NET Core进程中锁定了对象?

Col*_*nee 5 c# lldb .net-core

我在Linux上运行了一个死锁的.NET Core进程.我已经附加了lldb并且我可以看到有数百个线程被卡住Monitor.ReliableEnter,并且它们似乎都试图锁定同一个对象,但我无法弄清楚哪个线程正在持有它.

使用windbg通过!SyncBlk命令在Windows上这是微不足道的,但据我所知,Linux上没有相应的东西.对象的同步块包含持有锁的线程,我可以找到被锁定对象的同步块索引,但我不知道同步块表在内存中的位置.

如何确定哪个线程持有此对象的锁?

小智 3

以前我不知道有什么好的方法可以做到这一点(除了使用本机调试器+ Net Core 源代码手动剖析内存)。

好消息是我们刚刚合并了一个 PR 来恢复 !SyncBlk 功能。 https://github.com/dotnet/coreclr/pull/20830所以我希望 !SyncBlk 能够在下一个主要 .Net Core 版本中回归。如果您不想等待,您也可以使用 master 的每日构建,但需要注意的是每日构建可能潜伏着一些错误。