में सी # स्टैक ट्रेस प्रदर्शित करने में समस्या मेरे पास एक सी # प्रोग्राम में एक हैंडल लीक है। मैं WinDbg का उपयोग करके इसका निदान करने की कोशिश कर रहा हूं! Htrace, लगभग this answer में प्रस्तुत किया गया है, लेकिन जब मैं चलाता हूं! WinDbg में htrace -diff मुझे स्टैक निशान के साथ प्रस्तुत किया जाता है जो मेरे सी # कार्यों (या यहां तक कि यहां तक कि नामों के नाम भी नहीं दिखाते हैं) मेरा .NET असेंबली)।WinDbg
मैंने अपनी कठिनाई को स्पष्ट करने के लिए एक छोटा परीक्षण कार्यक्रम बनाया। यह कार्यक्रम "रिसाव" हैंडल को छोड़कर कुछ भी नहीं करता है।
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 में मैं "फ़ाइल" जाना -> "खोलें निष्पादन" और मेरे कार्यक्रम का चयन (डी: \ परियोजनाओं \ रेत की खान \ बिन \ डीबग \ 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.
आप देख सकते हैं, स्टैक ट्रेस मेरी सी # समारोह के नाम याद आ रही है "मुख्य" और "fun1": यह मैं क्या मिलता है। मेरा मानना है कि "System_ni + 0x ..." फ्रेम मेरे फ़ंक्शन फ्रेम हो सकते हैं, लेकिन मुझे नहीं पता। मेरा सवाल यह है कि, मैं स्टैक ट्रेस में अपने सी # कार्यों के लिए फ़ंक्शन नाम प्रदर्शित करने के लिए WinDbg कैसे प्राप्त करूं?
अतिरिक्त जानकारी:/प्रतीकोंhttp://msdl.microsoft.com/download/symbols;D:: \ परियोजनाओं \ रेत की खान \ बिन \ डीबग; SRV *
मैं नहीं मेरे WinDbg प्रतीक खोज पथ
SRV सी है WinDbg में निष्पादन योग्य खोलने पर कोई त्रुटि प्राप्त करें। आउटपुट निर्देशिका में "Sandpit.pdb" नामक एक फ़ाइल है ("डी: \ प्रोजेक्ट्स \ सैंडपिट \ बिन \ डीबग")। परियोजना स्थानीय रूप से बनाई गई है ताकि पीडीबी फ़ाइल exe से मेल खाना चाहिए। मैंने WinDbg from here डाउनलोड किया। मेरे पास विजुअल स्टूडियो में प्रोजेक्ट सेटिंग्स में "मूल कोड डिबगिंग सक्षम करें" है।
स्टैक ट्रेस को देखते हुए उस सूची हैंडल भंडारण है आपको बताने के लिए नहीं जा रहा है। आपको इसके बजाय ढेर को देखने की जरूरत है। विंडबग में बहुत दर्दनाक, ढेर एक बड़ी आग नली है। इसके बजाए एक .NET मेमोरी प्रोफाइलर पर विचार करें। –