我有一个简单的测试程序导致无限等待锁定。
public class SyncBlock
{
}
class Program
{
public static SyncBlock sync = new SyncBlock();
private static void ThreadProc()
{
try
{
Monitor.Enter(sync);
}
catch (Exception)
{
//Monitor.Exit(sync);
Console.WriteLine("3rd party code threw an exception");
}
}
static void Main(string[] args)
{
Thread newThread = new Thread(ThreadProc);
newThread.Start();
Console.WriteLine("Acquiring lock");
Monitor.Enter(sync);
Console.WriteLine("Releasing lock");
Monitor.Exit(sync);
}
}
所以主线程在尝试执行 Monitor.Enter(sync) 时基本上被锁定。如果我在主线程上查看 !clrStack ,它的输出基本上表明它是有意义的,但是当我尝试查看堆栈的本机端时,我希望看到一些 Wait on single/multiple object type of call 但我没有看到它。谁能解释一下。谢谢
0:000> !CLRStack
未加载 mscorwks.dll 的 PDB 符号
OS 线程 ID:0x1e8 (0)
ESP EIP
0012f0a8 77455e74 [GCFrame: 0012f0a8]
0012f178 77455e74 [HelperMethodFrame_1OBJ: 0012f178] System.Threading.Monitor.Enter (System.Threading.Monitor.Enter (System.Threading.Monitor.Enter (System.Threading.Monitor.Enter) (System.Threading.Monitor.Enter (System.Threading.Monitor.Object) 0012f1d10.Program.Object) 0012f1d10. Main(System.String[])
0012f400 70fc1b4c [GCFrame: 0012f400]
0:000> kb
ChildEBP RetAddr Args to Child
警告:堆栈展开信息不可用。以下框架可能是错误的。
0012EEB4 710AFB92 0012EE68 002D6280 00000000 NTDLL!KIFASTSYSTEMCALLRER
0012EF1C 710AF7C3 00000000 MSCORWKS!STREATNAMEFREEBUFFER + 0x1B1F2
0012EF3C 710AF8CC 00000001 002D6280 00000000 MSCORWKS!STRONDNAMEFREEBUFFER + 0x1ae23
0012efc0 710af961 00000001 002d6280 00000000 mscorwks!StrongNameFreeBuffer + 0x1af2c
0012f010 710afae1 00000001 002d6280 00000000 mscorwks!StrongNameFreeBuffer + 0x1afc1
0012f06c 70fdc5ae FFFFFFFF 00000001 00000000 mscorwks!StrongNameFreeBuffer + 0x1b141
0012f080 710df68a FFFFFFFF 00000001 00000000 mscorwks!LogHelp_NoGuiOnAssert + 0x10562
0012f10c 710b1154 002aad90 FFFFFFFF 002aad90 mscorwks!StrongNameFreeBuffer + 0x4acea
0012f128 710b10d8 42b8b47d 00000000 002aad90 mscorwks!StrongNameFreeBuffer + 0x1c7b4
0012f1e0 70fc1b4c 0012f1f0 0012f230 0012f270 mscorwks!StrongNameFreeBuffer + 0x1c738
0012f1f0 70fd2219 0012f2c0 00000000 0012f290 mscorwks + 0x1b4c
0012f270 70fe6591 0012f2c0 00000000 0012f290 mscorwks!LogHelp_NoGuiOnAssert + 0x61cd
0012f3ac 70fe65c4 0023c038 0012f478 0012f444 mscorwks!CoUninitializeEE + 0x2ead
0012f3c8 70fe65e2 0023c038 0012f478 0012f444 mscorwks!CoUninitializeEE + 0x2ee0
0012f3e0 7103389d 0012f444 42b8b0f1 00000000 mscorwks!CoUninitializeEE + 0x2efe
0012f544 710337bd 002332e0 00000001 0012f580 mscorwks!GetPrivateContextsPerfCounters + 0xf546
0012f7ac 71033d0d 00000000 42b8b9c9 00000001 mscorwks!GetPrivateContextsPerfCounters + 0xf466
0012fc7c 71033ef7 00ce0000 00000000 42b8979 mscorwks!GetPrivateContextsPerfCounters+0xf9b6
0012fccc 71033e27 00ce0000 42b8b8a1 00000000 mscorwks!CorExeMain+0x168
* 错误:找不到符号文件。默认为 C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoreei.dll 导出符号 - 0012fd14 71cf55ab 71033d8f 0012fd30 71f37f16 mscorwks!CorExeMain+0x98
*错误:找不到符号文件。默认为出口符号C:\ WINDOWS \ SYSTEM32 \ mscoree.dll中-
0012fd20 71f37f16 00000000 71cf0000 0012fd44 mscoreei CorExeMain + 0x38! 0012fd30
71f34de3 00000000 7723d0e9 7ffd8000 mscoree CreateConfigStream + 0x13f! 0012fd44
774319bb 7ffd8000 084952f9 00000000 mscoree CorExeMain + 0x8中! 0012fd84
7743198e 71f34ddb 7ffd8000 00000000 ntdll!RtlInitializeExceptionChain+0x63
0012fd9c 00000000 71f34ddb 7ffd8000 00000000 ntdll!RtlInitializeExceptionChain+0x36