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

How can I debug which thread has an object locked in a .NET Core process on Linux?

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

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

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

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

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