Mam przeciek uchwyt w programie C#. Próbuję zdiagnozować go przy użyciu WinDbg przy użyciu! Htrace, mniej więcej tak, jak przedstawiono w this answer, ale po uruchomieniu! Htrace -diff w WinDbg prezentowane są ślady stosu, które nie pokazują nazw moich funkcji C# (lub nawet moje zgromadzenie .net).Problemy wyświetlające śledzenie stosu C# w WinDbg
Stworzyłem mały program testowy, aby zilustrować moją trudność. Ten program nie robi nic poza uchwytami "wyciekowymi".
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));
}
}
Skompilowałem zespół, a następnie w WinDbg idę "Plik" -> "Otwórz wykonywalny" i wybierz swój program (D: \ Projects \ piaskownica \ bin \ Debug \ Sandpit.exe). Kontynuuję wykonywanie programu, łamam go i uruchamiam "! Htrace -enable", a następnie kontynuuję przez nieco dłużej, a następnie łamam i uruchamiam "! Htrace -diff". To jest to, co mam:
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.
Jak widać, ślad stosu brakuje mi nazwy funkcji C# „Main” i „Fun1”. Wierzę, że ramki "System_ni + 0x ..." mogą być ramkami funkcji, ale nie wiem. Moje pytanie brzmi: w jaki sposób można uzyskać, aby WinDbg wyświetlał nazwy funkcji dla moich funkcji C# w śledzeniu stosu?
Dodatkowe informacje: My WinDbg ścieżka wyszukiwania symbolem jest
SRV C:/symbolehttp://msdl.microsoft.com/download/symbols;D: \ Projects \ piaskownica \ bin \ Debug; srv *
nie wiem dostaję jakiekolwiek błędy po otwarciu pliku wykonywalnego w WinDbg. W katalogu wyjściowym znajduje się plik o nazwie "Sandpit.pdb" ("D: \ Projects \ Sandpit \ bin \ Debug"). Projekt jest zbudowany lokalnie, więc plik pdb powinien pasować do pliku exe. Pobrałem WinDbg from here. Mam "Włącz debugowanie kodu natywnego" zaznaczone w ustawieniach projektu w Visual Studio.
Patrząc na ślady stosu nie powie ci, że lista jest przechowywanie uchwyty. Zamiast tego musisz spojrzeć na stertę. Bolesne w Windbg, kupa to ogromny wąż strażacki. Zamiast tego należy rozważyć profiler pamięci .NET. –