簡體   English   中英

無法在WinDbg中顯示C#堆棧跟蹤

[英]Trouble displaying C# stack trace in WinDbg

我在C#程序中有一個句柄泄漏。 我正在嘗試使用WinDbg使用!htrace進行診斷,大致如本答案所示 ,但是當我在WinDbg中運行!htrace -diff時,我看到的堆棧跟蹤沒有顯示我的C#函數的名稱(或者甚至我的.net組裝)。

我創建了一個小測試程序來說明我的難度。 除“泄漏”手柄外,該程序不執行任何操作。

class Program
{
    static List<Semaphore> handles = new List<Semaphore>();

    static void Main(string[] args)
    {
        while (true)
        {
            Fun1();
            Thread.Sleep(100);
        }
    }

    static void Fun1()
    {
        handles.Add(new Semaphore(0, 10));            
    }
}

我編譯了程序集,然后在WinDbg中我去“File” - >“Open Executable”並選擇我的程序(D:\\ Projects \\ Sandpit \\ bin \\ Debug \\ Sandpit.exe)。 我繼續執行程序,打破它,然后運行“!htrace -enable”,然后再繼續一段時間,然后打破並運行“!htrace -diff”。 這就是我得到的:

0:004> !htrace -enable
Handle tracing enabled.
Handle tracing information snapshot successfully taken.
0:004> g
(1bd4.1c80): Break instruction exception - code 80000003 (first chance)
eax=7ffda000 ebx=00000000 ecx=00000000 edx=77b2f17d esi=00000000 edi=00000000
eip=77ac410c esp=0403fc20 ebp=0403fc4c iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
77ac410c cc              int     3
0:004> !htrace -diff
Handle tracing information snapshot successfully taken.
0xd new stack traces since the previous snapshot.
Ignoring handles that were already closed...
Outstanding handles opened since the previous snapshot:
--------------------------------------
Handle = 0x00000250 - OPEN
Thread ID = 0x00001b58, Process ID = 0x00001bd4

0x77ad5704: ntdll!ZwCreateSemaphore+0x0000000c
0x75dcdcf9: KERNELBASE!CreateSemaphoreExW+0x0000005e
0x75f5e359: KERNEL32!CreateSemaphoreW+0x0000001d
*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_32\System\13c079cdc1f4f4cb2f8f1b66c8642faa\System.ni.dll
0x65d7e805: System_ni+0x0020e805
0x65d47843: System_ni+0x001d7843
0x65d477ef: System_ni+0x001d77ef
0x004700c9: +0x004700c9
0x67d73dd2: clr!CallDescrWorkerInternal+0x00000034
0x67d9cf6d: clr!CallDescrWorkerWithHandler+0x0000006b
0x67d9d267: clr!MethodDescCallSite::CallTargetWorker+0x00000152
0x67eb10e0: clr!RunMain+0x000001aa
0x67eb1200: clr!Assembly::ExecuteMainMethod+0x00000124
--------------------------------------
Handle = 0x0000024c - OPEN
Thread ID = 0x00001b58, Process ID = 0x00001bd4

0x77ad5704: ntdll!ZwCreateSemaphore+0x0000000c
0x75dcdcf9: KERNELBASE!CreateSemaphoreExW+0x0000005e
0x75f5e359: KERNEL32!CreateSemaphoreW+0x0000001d
0x65d7e805: System_ni+0x0020e805
0x65d47843: System_ni+0x001d7843
0x65d477ef: System_ni+0x001d77ef
0x004700c9: +0x004700c9
0x67d73dd2: clr!CallDescrWorkerInternal+0x00000034
0x67d9cf6d: clr!CallDescrWorkerWithHandler+0x0000006b
0x67d9d267: clr!MethodDescCallSite::CallTargetWorker+0x00000152
0x67eb10e0: clr!RunMain+0x000001aa
0x67eb1200: clr!Assembly::ExecuteMainMethod+0x00000124
...
--------------------------------------
Displayed 0xd stack traces for outstanding handles opened since the previous snapshot.

如您所見,堆棧跟蹤缺少我的C#函數名稱“Main”和“Fun1”。 我相信“System_ni + 0x ......”幀可能是我的功能幀,但我不知道。 我的問題是,如何讓WinDbg在堆棧跟蹤中顯示我的C#函數的函數名?

額外信息:我的WinDbg符號搜索路徑是

SRV C:/ symbols http ://msdl.microsoft.com/download/symbols;D:\\ Projects \\ Sandpit \\ bin \\ Debug; srv *

當我在WinDbg中打開可執行文件時,我沒有收到任何錯誤。 輸出目錄中有一個名為“Sandpit.pdb”的文件(“D:\\ Projects \\ Sandpit \\ bin \\ Debug”)。 該項目是在本地構建的,因此pdb文件應與exe匹配。 從這里下載了WinDbg。 我在Visual Studio的項目設置中選中了“啟用本機代碼調試”。

WinDbg嘗試盡可能地解釋本機調用堆棧,但是要完全解釋CLR應用程序的堆棧,WinDbg需要使用名為SOS的擴展。 此擴展具有單獨的命令CLRStack用於查看CLR堆棧的堆棧信息。 您將需要首先加載SOS擴展,但是使用.loadby sos clr命令(或類似的,我記得加載正確版本的SOS可能會有點痛苦)

有關更多信息,請參閱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM