我在Linux上运行了一个死锁的.NET Core进程。我已经附加了lldb,我可以看到Monitor.ReliableEnter
上有数百个线程,它们似乎都试图锁定同一对象,但是我无法弄清楚哪个线程持有该对象。 / p>
在Windows上通过!SyncBlk
命令使用windbg来说是微不足道的,但是据我所知,在Linux上没有等效的方法。对象的同步块包含持有锁定的线程,我可以找到被锁定对象的同步块索引,但是我不知道同步块表在内存中的位置。
如何确定哪个线程对该对象持有锁?
答案 0 :(得分:3)
以前,我不知道执行此操作的任何好方法(除了使用本机调试器+ Net Core源代码手动剖析内存外)。
好消息是我们刚刚合并PR以恢复!SyncBlk功能。 https://github.com/dotnet/coreclr/pull/20830,所以我希望!SyncBlk可以在下一个主要的.Net Core版本中恢复使用。如果您不想等待,也可以使用master的每日构建,标准警告是,每日构建可能会潜伏一些错误。