作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个在 Linux 上运行的死锁 .NET Core 进程。我附加了 lldb,我可以看到有数百个线程卡在 Monitor.ReliableEnter
上,它们似乎都试图锁定同一个对象,但我无法确定是哪个线程拿着它。
这在 Windows 上通过 !SyncBlk
命令使用 windbg 是微不足道的,但据我所知,Linux 上没有等效项。对象的同步块(synchronized block)包含持有锁的线程,我可以找到被锁定对象的同步块(synchronized block)索引,但我不知道同步块(synchronized block)表在内存中的位置。
我如何确定哪个线程持有此对象的锁?
最佳答案
以前我不知道有什么好方法可以做到这一点(除了使用 native 调试器 + Net Core 源代码手动剖析内存)。
好消息是我们刚刚合并了一个 PR 以恢复 !SyncBlk 功能。 https://github.com/dotnet/coreclr/pull/20830所以我希望 !SyncBlk 在下一个主要的 .Net Core 版本中回归。如果您不想等待,也可以使用 master 的每日构建,但标准警告是每日构建可能会潜伏一些错误。
关于c# - 如何调试哪个线程在 Linux 上的 .NET Core 进程中锁定了对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52937977/
我是一名优秀的程序员,十分优秀!