Windbg本机调用堆栈跟踪没有意义

Windbg本机调用堆栈跟踪没有意义,windbg,sos,Windbg,Sos,我有一个简单的测试程序,它会导致无限长的等待锁 public class SyncBlock { } class Program { public static SyncBlock sync = new SyncBlock(); private static void ThreadProc() { try { Monitor.Enter(sync); } catch (Exce

我有一个简单的测试程序,它会导致无限长的等待锁

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(同步)时基本上是被锁定的。如果我看!主线程上的clrStack,其输出基本上显示它,这是有意义的,但当我尝试查看堆栈的本机端时,我希望看到一些单/多对象类型的调用等待,但我没有看到它。有人能解释一下吗。谢谢

0:000> !CLRStack  
未加载mscorwks.dll的PDB符号
操作系统线程Id:0x1e8(0)
ESP EIP
0012f0a8 77455e74[GCFrame:0012f0a8]
0012f178 77455e74[HelperMethodFrame_1OBJ:0012f178]System.Threading.Monitor.Enter(System.Object) 0012F1D000A40177控制台应用程序1.Program.Main(System.String[])
0012f400 70fc1b4c[GCFrame:0012f400]
0:000>kb
ChildEBP将参数重新寻址到Child
警告:堆栈展开信息不可用。以下帧可能错误。
0012eeb4 710afb92 0012ee68 002d6280 00000000 ntdll!KiFastSystemCallRet
0012ef1c 710af7c3 0000000 1 002d6280 00000000 mscorwks!StrongNameFreeBuffer+0x1b1f2
0012ef3c 710af8cc 0000000 1 002d6280 00000000 mscorwks!StrongNameFreeBuffer+0x1ae23
0012efc0 710af961 0000000 1 002d6280 00000000 mscorwks!StrongNameFreeBuffer+0x1af2c
0012F0010 710afae1 0000000 1 002d6280 00000000 mscorwks!StrongNameFreeBuffer+0x1afc1
0012f06c 70fdc5ae FFFFFFFF00000001 00000000 mscorwks!StrongNameFreeBuffer+0x1b141
0012f080 710df68a FFFFFFFF00000001 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 MSCorks!StrongNameFreeBuffer+0x1c738
0012f1f0 70fd2219 0012f2c0 00000000 0012f290 mscorwks+0x1b4c
0012f270 70fe6591 0012F2C000000000 0012f290 MSCorks!日志帮助\u NoGuiOnAssert+0x61cd
0012f3ac 70fe65c4 0023c038 0012f478 0012f444 MSCorks!conInitializeee+0x2ead
0012f3c8 70fe65e2 0023C38 0012f478 0012f444 MSCorks!conInitializeee+0x2ee0
0012f3e0 7103389d 0012f444 42b8b0f1 00000000 mscorwks!conInitializeee+0x2efe
0012f544 710337bd 002332E000000001 0012f580 mscorwks!GetPrivateContextsPerfCounters+0xf546
0012f7ac 71033d0d 00000000 42b8b9c9 0000000 1 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 MSCorei!CorExeMain+0x38
0012fd30 71f34de3 00000000 7723d0e9 7ffd8000 mscoree!CreateConfigStream+0x13f
0012fd44 774319bb 7ffd8000 084952f9 00000000 mscoree!CorExeMain+0x8
0012fd84 7743198e 71f34ddb 7ffd8000 00000000 ntdll!RtlinizationExceptionChain+0x63

0012fd9c 00000000 71f34ddb 7ffd8000 00000000 ntdll!RTLinitalizeExceptionChain+0x36

您必须将windbg指向microsoft windows symbols服务器才能获得良好的堆栈跟踪

在windbg命令窗口中键入以下内容:

.sympath srv*c:\websymbols*http://msdl.microsoft.com/download/symbols

另请参见:

另外,为了回答您最初关于如何调试的问题,这里有一本食谱:

0:000> !clrstack OS Thread Id: 0x1358 (0) ESP EIP 0012f328 7c90e514 [GCFrame: 0012f328] 0012f3f8 7c90e514 [HelperMethodFrame_1OBJ: 0012f3f8] System.Threading.Monitor.Enter(System.Object) 0012f450 00d10177 Program.Main(System.String[]) 0012f688 79e71b4c [GCFrame: 0012f688] 0:000> !clrstack 操作系统线程Id:0x1358(0) 电子稳定程序 0012f328 7c90e514[GCFrame:0012f328] 0012f3f8 7c90e514[HelperMethodFrame_1OBJ:0012f3f8]System.Threading.Monitor.Enter(System.Object) 0012f450 00d10177程序.Main(系统字符串[]) 0012f688 79e71b4c[GCFrame:0012f688] 在原始程序中,首先启动后台线程。因此,它获得了锁。但是,它没有释放锁就退出了。在此之后,主线程试图获取锁,但它被卡住了,因为锁已经被拥有

你怎么知道谁拥有它?首先做一个测试!线程后面跟着!同步BLK

0:000> !threads ThreadCount: 3 UnstartedThread: 0 BackgroundThread: 1 PendingThread: 0 DeadThread: 1 Hosted Runtime: no PreEmptive GC Alloc Lock ID OSID ThreadOBJ State GC Context Domain Count APT Exception 0 1 1358 0014bb00 200a020 Enabled 00000000:00000000 001540d0 0 MTA 2 2 1360 0015e320 b220 Enabled 00000000:00000000 001540d0 0 MTA (Finalizer) XXXX 3 0 00175a98 9820 Enabled 00000000:00000000 001540d0 1 Ukn 0:000> !syncblk Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 2 0017903c 3 1 00175a98 0 XXX 013503cc SyncBlock ----------------------------- Total 2 CCW 0 RCW 0 ComClassFactory 0 Free 0 0:000> !线程 线程数:3 未启动的线程:0 背景线索:1 PendingThread:0 死线:1 托管运行时:否 抢占式GC分配锁 ID OSID ThreadOBJ状态GC上下文域计数APT异常 0 1 1358 0014bb00 200a020启用00000000:00000000 001540d0 0 MTA 2 2 1360 0015e320 b220已启用00000000:00000000 001540d0 0 MTA(终结器) XXXX 3 0 00175a98 9820已启用00000000:00000000 001540d0 1 Ukn 0:000> !同步BLK 索引SyncBlock MonitorHold递归拥有线程信息SyncBlock所有者 2 0017903c 3 1 00175a98 0 XXX 013503C同步块 ----------------------------- 总数2 常规武器公约0 RCW 0 ComClassFactory0 免费0 如你所见!syncblk表示owining线程对象是00175a98。从天上掉下来!线程输出时,可以看到线程对象00175a98是拥有锁时退出的死线程


希望这有帮助。

指向符号服务器确实解决了与kb输出相关的问题,但是我仍然不确定您是否从其他链接回答了我的问题。我将添加我对该链接的评论。谢谢