gpt4 book ai didi

Windbg native 调用堆栈跟踪没有意义

转载 作者:行者123 更新时间:2023-12-01 19:26:07 25 4
gpt4 key购买 nike

我有一个简单的测试程序,导致锁定无限等待。

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,它的输出基本上显示它是有意义的,但是当我尝试查看堆栈的 native 端时,我期望看到一些 Wait on single/multiple object type of call 但我没有看到它。谁能解释一下。谢谢

0:000> !CLRStack  

未加载 mscorwks.dll 的 PDB 符号
操作系统线程 ID:0x1e8 (0)
ESP EIP
0012f0a8 77455e74 [GC帧:0012f0a8]
0012f178 77455e74 [HelperMethodFrame_1OBJ: 0012f178] System.Threading.Monitor.Enter (System.Object)0012f1d0 00a40177 ConsoleApplication1.Program.Main(System.String[])
0012f400 70fc1b4c [GC帧:0012f400]
0:000> kb
ChildEBP RetAddr 参数到子
警告:堆栈展开信息不可用。以下框架可能有误。
0012eeb4 710afb92 0012ee68 002d6280 00000000 ntdll!KiFastSystemCallRet
0012ef1c 710af7c3 00000001 002d6280 00000000 mscorwks!StrongNameFreeBuffer+0x1b1f2
0012ef3c 710af8cc 00000001 002d6280 00000000 mscorwks!StrongNameFreeBuffer+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!CoreExeMain+0x168
* 错误:找不到符号文件。默认导出 C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoreei.dll 的符号 -0012fd14 71cf55ab 71033d8f 0012fd30 71f37f16 mscorwks!CoreExeMain+0x98
*
错误:找不到符号文件。默认导出 C:\Windows\system32\mscoree.dll 的符号 -
0012fd20 71f37f16 00000000 71cf0000 0012fd44 mscoreei!CoreExeMain+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

最佳答案

您必须将 Windbg 指向 microsoft windows 符号服务器才能获得良好的堆栈跟踪。

在 Windbg 命令窗口中输入以下内容:

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

另请参阅:

Using microsoft symbol server to get symbols

此外,为了回答您关于如何调试此问题的原始问题,这里是食谱:

0:000> !clrstackOS 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] 

在您的原始程序中,首先启动后台线程。所以,它获得了锁。然而它退出时没有释放锁。之后,您的主线程尝试获取锁,但由于锁已被拥有而被卡住。

如何找出谁拥有它?首先执行 !threads,然后执行 !syncblk。

0:000> !threadsThreadCount: 3UnstartedThread: 0BackgroundThread: 1PendingThread: 0DeadThread: 1Hosted 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 Ukn0:000> !syncblkIndex SyncBlock MonitorHeld Recursion Owning Thread Info  SyncBlock Owner    2 0017903c            3         1 00175a98     0 XXX   013503cc SyncBlock-----------------------------Total           2CCW             0RCW             0ComClassFactory 0Free            0

正如你所看到的,!syncblk 表示所属线程对象是00175a98。从 !threads 输出中,您可以看到线程对象 00175a98 是在拥有锁时退出的死线程。

希望这有帮助。

关于Windbg native 调用堆栈跟踪没有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3902682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com