如何将诊断添加到 C# 锁定功能以进行多线程调试

How to add diagnostics to C# lock function for multithreading debugging

是否可以填充 C# 锁定功能以添加诊断?
我很想知道何时获取或释放锁、锁计数以及获取锁的线程的托管线程 ID。

在 C++ 中,您可以编写自己的 Mutex class 并提供自己的锁定功能,您可以自己添加此类诊断。

是否可以包装锁定功能或填充功能以提供诊断?

在此先感谢您的帮助。

你不能填充 lock 语句,但你当然可以实现你自己的锁 class 委托给 Monitor class (它是 lock).

C# 规范 8.12 说 lock 语句是 "precisely equivalent" 到:

bool __lockWasTaken = false;
try {
    System.Threading.Monitor.Enter(x, ref __lockWasTaken);
    ...
}
finally {
    if (__lockWasTaken) System.Threading.Monitor.Exit(x);
}

所以没办法"hook in"。不过,我想知道,如果您定义自己的方法 System.Threading.Monitor.Enter 会发生什么……您永远不会让编译器使用它,因为它是一个不明确的名称。但是规范并没有说明接下来会发生什么。

您或许可以安装自定义 CLR 主机或探查器并使用本机 API 来填充锁。不过,这是一个核选项。