2012-10-23 31 views
5

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.

+0

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. –

Odpowiedz

6

Program WinDbg próbuje zinterpretować macierzysty stos wywołań, najlepiej jak potrafi, jednak aby w pełni zinterpretować stos aplikacji CLR, WinDbg musi użyć rozszerzenia o nazwie SOS. To rozszerzenie ma osobne polecenie CLRStack do przeglądania informacji o stosie stosów CLR. trzeba będzie załadować rozszerzenie SOS pierwszy jednak za pomocą komendy .loadby sos clr (lub podobne, pamiętam uzyskanie poprawnej wersji SOS załadować może być trochę uciążliwe)

Aby uzyskać więcej informacji, zobacz

+2

Dzięki! To wyjaśnia, dlaczego byłem tak zdezorientowany. Czytałem o sos.dll, ale błędnie założyłem, że musiałem go załadować tylko dla poleceń takich jak htrace do pracy z CLR. Byłem bliżej rozwiązania, używając '! Htrace', a następnie'! U' z adresem stosu. To wydawało się mieć problemy z przechodzeniem przez ramki p-invoke, więc ustawiłem punkt przerwania w jednym z punktów zwróconych przez htrace i użyłem '! Clrstack' do wyświetlenia pełnego stosu CLR. – Mike

Powiązane problemy