EventTrace विंडोज के लिए। हाई-स्पीड नेटवर्क ड्राइवर डीबगिंग

विभिन्न डिबगिंग तकनीकें हैं: कोई डिबगर में खोदता है, कोई ध्यान करता है, आत्मज्ञान की प्रतीक्षा करता है, कोई व्यक्ति भाग्य की उम्मीद में कोड को बदल देता है, लेकिन लगभग कोई भी उस फ़ाइल को मना नहीं करता है जिसमें प्रक्रिया के अंतिम क्षणों को बचाया जाएगा, क्या हुआ , किस सूत्र में, किस गुठली पर, किस समय। सावधानीपूर्वक और पेडन्यू बचाए गए डिबगिंग जानकारी कई कामकाजी घंटों को बचा सकती है, खासकर जब यह डीबग करने की बात आती है तो ड्राइवर और हार्डवेयर जिसके साथ यह काम करता है। खैर, मामले में जब त्रुटि यादृच्छिक होती है और एक सप्ताह के भीतर 20 की 1 प्रणाली पर पुन: पेश की जाती है, तो सूचना को डीबग किए बिना, ध्यान में देरी हो सकती है।
यह आलेख उन उपयोगिताओं के बारे में बात करेगा जो एक ही समय में कई मशीनों पर चलने वाले ड्राइवरों से डिबग संदेशों को रोकने और भंडारण और विश्लेषण के लिए सर्वर को संदेश भेजने में मदद करते हैं।


प्रागितिहास


विंडोज टेक्नोलॉजी के लिए इवेंटट्रेस को पहले विंडोज 2k में शामिल किया गया था और तब से यह सभी बाद के ओएस का एक वफादार साथी रहा है, धीरे-धीरे सॉफ्टवेयर की बढ़ती संख्या को भेद रहा है: ड्राइवरों से उपयोगकर्ता अनुप्रयोगों तक।
यह कहना मुश्किल है कि यह एक सफलता थी, लेकिन ईटीडब्ल्यू में एक हाइलाइट - गति है। ड्राइवर की गहराई से प्रति सेकंड हजारों डिबगिंग संदेशों के प्रदर्शन पर एक अल्प प्रभाव के साथ एक इंजीनियर की कल्पना के लिए जगह मिलती है। और अगर हम इसे प्राप्त जानकारी के विस्तार और सटीकता से जोड़ते हैं, तो जीवन बादल रहित होने लगता है।
इस भावना से प्रेरित होकर, हमने लागू करना शुरू किया। कठिनाइयाँ लगभग तुरंत शुरू हुईं और इन कठिनाइयों का नाम था - ट्रेस व्यू । यह उपयोगिता, डिबग संदेशों को प्राप्त करने और देखने के लिए डिज़ाइन की गई है, हठपूर्वक वह नहीं करना चाहता था जो इसके लिए बनाया गया था।
यदि संदेश वितरण तकनीक पर अच्छी तरह से काम किया गया था - ETW ने आसानी से दसियों को निगल लिया, लेकिन यह रसीद के साथ काम नहीं करता था, तो ऐसा लगता था कि TraceView निगम की आंतों में एक अकेला इंजीनियर द्वारा अपनी आवश्यकताओं के लिए बनाया गया था और गलती से DDK में समाप्त हो गया था।

समस्या


लंबे परीक्षणों के परिणामों के एक और नुकसान के बाद, यह उन सभी कठिनाइयों को वर्गीकृत करने का निर्णय लिया गया था जो हमें सामना करना पड़ा और एक विकल्प की तलाश में था जो हमारे लिए उपयुक्त होगा। जो लोग कारणों की सूची देखना चाहते हैं, वे उन्हें नीचे पा सकते हैं
स्पॉइलर।
  • बड़ी फ़ाइलों के साथ काम करें (यदि फ़ाइल 25 मेगाबाइट से अधिक हो तो बड़ी फ़ाइल मानी जाती है)। ऐसी फ़ाइल खोलने में काफी समय लगता है;
  • सेवा डेटा का नुकसान। नियमित रूप से ईटीडब्ल्यू, एक फ़ाइल को सहेजना, एक सेवा हेडर लिखना भूल जाता है। इसके बाद, इस तरह की फ़ाइल की खोज करने पर, एक को हेक्साडेसिमल संपादक पर लंबे समय तक ध्यान करना पड़ता है, डेटा को पुनर्स्थापित करता है। यह विशेष रूप से आक्रामक है जब फ़ाइल में त्रुटि जानकारी होती है जिसे कई दिनों तक पुन: प्रस्तुत नहीं किया जा सकता है। विंडोज 8 ने इस दोष को ठीक करने का वादा किया;
  • वास्तविक समय में, संदेश दर्शक केवल 65 हजार रखता है। पहली नज़र में, यह बहुत कुछ है, लेकिन अगर आप कल्पना करते हैं कि ड्राइवर प्रति सेकंड कम से कम 1 हजार संदेश भेजता है, तो आप सभी पर विचार कर सकते हैं केवल 1 मिनट;
  • संदेश पाठ कॉपी करें। आप संदेश को केवल उसकी संपूर्णता में कॉपी कर सकते हैं; पाठ के कुछ हिस्सों के साथ काम करने का कोई तरीका नहीं है;
  • खोजें। वह वहां नहीं है;
  • बैकलाइटिंग को फ़िल्टरिंग विंडो के माध्यम से किया जाता है, रंग को उसके नाम से चुना जाता है: उदाहरण के लिए, "ग्रे - 50";
  • फ़िल्टर करना। पहले से सहेजे गए डेटा पर एक फ़िल्टर लागू करना एक तुच्छ कार्य नहीं है;
  • प्रोफाइल। नई प्रोफ़ाइल बनाना एक थकाऊ और लंबा काम है, जो सेटिंग्स के साथ अतिभारित है। आप उपयोगिता का उपयोग करके प्रोफाइल की नकल नहीं कर सकते हैं;


खोज से कोई नतीजा नहीं निकला, आवश्यकताओं के सबसे करीब ETViewer उपयोगिता थी, लेकिन इसमें सभी आवश्यक जरूरतों को शामिल नहीं किया गया था, इसके अलावा, इस पर काम छोड़ दिया गया था और डेवलपर्स की सूची वर्तमान में खाली है
हमारी समस्याओं के त्वरित समाधान के लिए आशाएं शून्य हो गई हैं। इस तथ्य के लिए अभ्यस्त होने के लिए, इसमें कुछ समय लगा, जिसके दौरान हमने अभी भी TraceView, संचित शक्ति और विचारों का उपयोग किया।

निर्णय


स्वतंत्र अनुसंधान के विचार को हमारे आर एंड डी विभाग के नेतृत्व ने समझ और उत्साह के साथ बधाई दी थी, लेकिन कार्यों की एक सूची को संकलित करने और तोते में इसका मूल्यांकन करने के बाद, यह स्पष्ट हो गया कि हमारे पास ऐसे मुक्त संसाधन नहीं थे। यह केवल सबसे बुनियादी कार्यक्षमता के लिए लगभग 6 मानव-महीने था। और, जैसा कि आप जानते हैं - भूख खाने के साथ आती है।
"विफलताओं" की एक श्रृंखला के बावजूद, मैं इस विचार को नहीं भूल सकता था। इस प्रकार, लगभग एक साल पहले शाम की एक श्रृंखला शुरू हुई, जब, एक नौकरी से आया, मैं दूसरे के लिए आगे बढ़ा। इस काम के परिणामस्वरूप, निम्नलिखित एप्लिकेशन और लाइब्रेरी पैदा हुए (स्रोत कोड Apache 2.0 लाइसेंस के तहत वितरित किए गए हैं):

इस सारे सामान की खासियत क्या है? ETW के साथ के रूप में, यह गति है। यह आधुनिक होम पीसी के लिए प्रति सेकंड लाखों डिबग संदेशों के बारे में है। उदाहरण के लिए: I7-870 की जोड़ी और एक गीगाबिट नेटवर्क प्रारूप के 2 मिलियन से अधिक संदेशों को निगल सकता है:
Trace(“Here is my trace and here are my values: %d %d”, iVal1, iVal2); 

स्ट्रिंग और मापदंडों के स्पष्ट प्रारूप के अलावा, निम्न डेटा भी प्रेषित किया जाता है:

बैकाल झील के किनारे, यह सब कुछ ऐसा दिखता है
छवि
छवि


दूसरा सबसे महत्वपूर्ण और सुविधाजनक बिंदु डिबग संदेशों का केंद्रीकृत संग्रह है। मैं एक उदाहरण देता हूं - जिस कंपनी के लिए मैं काम करता हूं वह इसके हार्डवेयर और सॉफ्टवेयर की लगभग सभी परतों को विकसित करती है। विकसित और परीक्षण करते समय, एक चिड़ियाघर को कई ग्रंथियों, चालकों और सॉफ्टवेयर से देखने पर बहुत समय खर्च किया जाता है। इसलिए, महत्वपूर्ण संकेतों की केंद्रीय रूप से निगरानी करने की क्षमता और, विफलता के मामले में, जो हुआ उसकी एक विस्तृत तस्वीर को पुनर्स्थापित करना अत्यधिक मूल्यवान है।
दुर्भाग्य से, और शायद सौभाग्य से, मैं अपने समय की सीमाओं के कारण सभी घटकों पर सभी संभव जानकारी एक लेख में फिट नहीं कर पाऊंगा। इसके अलावा, ETW के हुड के नीचे क्या है, इसका ओवरव्यू छोड़ा जाएगा, लेकिन यदि इसमें रुचि है, तो इस कमी को दूसरे लेख से भरा जा सकता है।

अंगारा


इसलिए मेरी कहानी में मुझे इसका हिस्सा मिला जिसके लिए इसे शुरू किया गया था। इस अध्याय में, मैं हैंगर को कॉन्फ़िगर और चलाने के तरीके के बारे में बात करूंगा। यह माना जाता है कि आप पहले से ही ETW से परिचित हैं और आपका ड्राइवर पहले से ही इसी तरह के संदेशों से लैस है।

ETW सत्र मापदंडों

प्रत्येक ETW सत्र का प्रारंभिक बिंदु नियंत्रण GUID है, आपकी किसी स्रोत फ़ाइल में समान रेखाएँ हैं:
 //{63423ADB-D156-4281-BA74-8ACAEDDBD810} #define WPP_CONTROL_GUIDS \ WPP_DEFINE_CONTROL_GUID(ProviderGuid, (63423ADB, D156, 48d5, B0BC, 8ACAEDDBD810),\ WPP_DEFINE_BIT(DBG_PROVIDER) /* bit 0 = 0x00000001 */ \ /* You can have up to 32 defines. If you want more than that,\ you have to provide another trace control GUID */\ ) 

हम WPP_DEFINE_CONTROL_GUID के मान में रुचि रखते हैं, जिसे फॉर्म {63423ADB-D156-4281-BA74-8ACAEDDBD810} के रूप में लिखा जा सकता है, याद रखें - आपको अभी भी इसकी आवश्यकता है।

दूसरा सबसे महत्वपूर्ण तत्व जिसे आपके ड्राइवर की आवश्यकता होगी वह है ट्रेस मैसेज फॉर्मेट फ़ाइल (TMF)। फ़ाइल डिबग संदेशों के प्रारूप का वर्णन करती है, और इसमें संदेश के बारे में अतिरिक्त जानकारी भी होती है। इस फ़ाइल को प्राप्त करने का सबसे आसान तरीका आपके ड्राइवर के सफलतापूर्वक निर्माण के बाद निम्नलिखित कमांड चलाना है:
 Tracepdb.exe -f MyDriver.pdb -o MyTraceMessageFormatFile.tmf 

Tracepdb.exe सुविधा को DDK के साथ आपूर्ति की जाती है, डिफ़ॉल्ट पथ है: C: \ WinDDK \ {संस्करण} \ tools \ tracing \

सेटिंग्स। प्रदाता

तो, हम एक नियंत्रण GUID और TMF फ़ाइल से लैस हैं - यह अंगारा कॉन्फ़िगरेशन फ़ाइल को संपादित करने का समय है, इसे "Angara.xml" कहा जाता है और निष्पादन योग्य फ़ाइलों के समान फ़ोल्डर में स्थित है। इसे किसी भी संपादक के साथ खोलें जो UTF-16 को समझता है, और हम संपादन शुरू कर सकते हैं।

पहला भाग जिसमें हम रुचि रखते हैं, ईटीडब्ल्यू प्रदाता को समर्पित है:
 <Provider TMF="." GUID="{63423ADB-D156-48d5-B0BC-8ACAEDDBD810}" Level="5" Flags="0xFFFFFFFFFFFFFFFF" Filter="" Platform="X32" /> 

केवल दो आवश्यक पैरामीटर हैं:


महत्वपूर्ण, लेकिन आवश्यक पैरामीटर फ्लैग और स्तर के पैरामीटर नहीं हैं। वे आपको चालक के पक्ष में अवांछित संदेशों को फ़िलहाल फ़िल्टर करने की अनुमति देते हैं, जिससे ईटीडब्ल्यू और सिस्टम पर लोड कम हो जाता है।
शेष वैकल्पिक मापदंडों को दस्तावेज़ीकरण में पर्याप्त विस्तार से वर्णित किया गया है , साथ ही साथ एक्सएमएल फ़ाइल में भी और यहां उनका विवरण प्रदान करना अनावश्यक है।

सेटिंग्स। नेटवर्क

अगला भाग नेटवर्क कनेक्टिविटी के बारे में है:
 <P7Trace Address="localhost" Port="9009" Packet="1472" Name="MyChannel" Verbosity="1" /> 

केवल एक आवश्यक पैरामीटर है - पता, आपको आईपी पता (IPv4 / IPv6) या पीसी का प्रतीकात्मक नाम दर्ज करना होगा, जिस पर बैकल चल रहा है। प्रलेखन में वैकल्पिक मापदंडों का विस्तार से वर्णन किया गया है

सेटिंग्स। स्तरों

अंतिम खंड एक मानचित्र है जिस पर बैकल को समझे जाने वाले संदेश स्तर पर ईटीडब्ल्यू संदेश स्तर का रूपांतरण होता है:
 <Levels> <Trace> <WPP Text="TRACE_LEVEL_VERBOSE"/> </Trace> <Debug> <WPP Text="TRACE_LEVEL_NONE"/> </Debug> <Info> <WPP Text="TRACE_LEVEL_INFORMATION"/> </Info> <Warning> <WPP Text="TRACE_LEVEL_WARNING"/> </Warning> <Error> <WPP Text="TRACE_LEVEL_ERROR"/> </Error> <Critical> <WPP Text="TRACE_LEVEL_FATAL"/> <WPP Text="TRACE_LEVEL_CRITICAL"/> </Critical> </Levels> 

इस अनुभाग का संपादन केवल तभी आवश्यक है जब आपने अपने ड्राइवर के स्रोत कोड में मैक्रो को फिर से परिभाषित किया हो, उदाहरण के लिए:
 // Define debug levels #define NONE 0 // Tracing is not on #define FATAL 1 // Abnormal exit or termination #define ERROR 2 // Severe errors that need logging #define WARNING 3 // Warnings such as allocation failure #define INFO 4 // Includes non-error cases such as Entry-Exit #define TRACE 5 // Detailed traces from intermediate steps #define LOUD 6 // Detailed trace from every step 


इस स्थिति में, XML अनुभाग निम्नलिखित रूप लेगा:
 <Levels> <Trace> <WPP Text="LOUD"/> </Trace> <Debug> <WPP Text="TRACE"/> </Debug> <Info> <WPP Text="INFO"/> </Info> <Warning> <WPP Text="WARNING"/> </Warning> <Error> <WPP Text="ERROR"/> </Error> <Critical> <WPP Text="FATAL"/> </Critical> </Levels> 


प्रारंभ

यह सब है, कॉन्फ़िगरेशन फ़ाइल को संपादित करना समाप्त हो गया है, आप चलाना शुरू कर सकते हैं। आप बैकल और अंगारा को किस क्रम में लॉन्च करेंगे - इससे कोई फर्क नहीं पड़ता है, लेकिन सभी भेजे गए संदेशों को स्वीकार करने में सक्षम होने के लिए सबसे पहले बैकल को लॉन्च करना उचित है, बस विनम्रतापूर्वक अपने फायरवाल से यह पूछना न भूलें कि अंगारा और बैकल के बीच यातायात को अवरुद्ध न करें
हैंगर शुरू करना बहुत सरल है:
 Angara_32.exe Angara.xml # Angara_64.exe Angara.xml 


हैंगर का एक उदाहरण:

एनबी : पुराने ऑपरेटिंग सिस्टम (विंडोज 2k, एक्सपी) पर, एक ईटीडब्ल्यू सत्र एक मध्यवर्ती फ़ाइल के बिना काम नहीं कर सकता है, इसलिए इन ओएस संस्करणों पर हैंगर शुरू करते समय, याद रखें कि हैंगर कुल 250 एमबी से 1 जीबी की कुल मात्रा के साथ कई अस्थायी फाइलें बनाने की कोशिश करेगा, यदि असफलता - प्रक्रिया समाप्त हो जाएगी।

दिखावट


संपूर्ण चित्रमय इंटरफ़ेस, या बल्कि, इसकी अनुपस्थिति, निम्नलिखित चित्र द्वारा वर्णित किया जा सकता है:
छवि
सत्र के बारे में स्थिर जानकारी के अलावा, 12 अलग-अलग काउंटर प्रदान किए जाते हैं, पर्याप्त रूप से बड़े और, वर्तमान में, अतिरिक्त मात्रा में जानकारी। कार्यक्रम के सक्रिय डिबगिंग के चरण में उनकी आवश्यकता थी और समस्या की जगह का सटीक पता लगाना संभव बना दिया, अब यह केवल एक ऐतिहासिक अवशेष है, जिसे तकनीकी निगरानी क्षमता के लक्ष्य के साथ छोड़ दिया गया था। काउंटरों को 3 समूहों में विभाजित किया गया है:


निष्कर्ष


मेरी कहानी यहां समाप्त होती है, मुझे उम्मीद है कि यहां प्रस्तुत उपयोगिताओं से ड्राइवरों और एप्लिकेशन सॉफ़्टवेयर के डेवलपर्स के कठिन लेकिन रचनात्मक जीवन की सुविधा होगी।

पुनश्च: स्रोत कोड और बाइनरी फ़ाइलों के साथ प्रोजेक्ट साइट , साथ ही साथ अंग्रेजी मदद भी
पीपीएस: बाई सी अल एक यादृच्छिक टाइपो नहीं है।

Source: https://habr.com/ru/post/In156817/


All Articles