विंडोज के लिए सीखना घटना अनुरेखण: सिद्धांत और व्यवहार

नमस्कार। हाल ही में, मुझे विंडोज ट्रेस सेवा से निपटने की आवश्यकता थी। यह सेवा विंडोज 2000 में दिखाई दी, हालांकि, इंटरनेट पर इस सेवा पर बहुत कम लेख थे। इसलिए इस लेख को लिखने का विचार प्रकट हुआ। तो, चलो शुरू करते हैं!

आज मैं इसके बारे में बात करने की कोशिश करूंगा:

  1. Windows अनुरेखण सेवा सिद्धांत
  2. आपका ETW सत्र बनाना
  3. ईटीडब्ल्यू के साथ काम करने के लिए ईवेंट ट्रेसिंग एपीआई का उपयोग करना
  4. ETW के साथ काम करने के लिए ट्रेसरप्ट और xperf का उपयोग करना

Windows अनुरेखण सेवा सिद्धांत


विंडोज (ईटीडब्ल्यू) के लिए ईवेंट ट्रेसिंग एक ऐसी सेवा है जो आपको वास्तविक समय में एक या एक से अधिक ईवेंट प्रदाताओं से एक निश्चित समय अवधि के लिए * .etl फ़ाइल से प्राप्त करने की अनुमति देती है। असमंजस में हैं? अब इसे समझ लेते हैं!

ईटीडब्ल्यू कैसे काम करता है यह समझने के लिए, आपको इस सेवा की संरचना को समझने की आवश्यकता है।

छवि

ईटीडब्ल्यू वास्तुकला में 4 तत्व शामिल हैं

  1. ईवेंट प्रदाता
  2. घटना उपभोक्ताओं
  3. ETW नियंत्रकों
  4. ETW सत्र (इवेंट ट्रेसिंग सत्र)

ऑपरेशन का सिद्धांत इस प्रकार है।

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

और अब हम काम के सिद्धांत को समझने के लिए अधिक विस्तार से ऊपर वास्तुकला के प्रत्येक तत्व पर विचार करेंगे!

इवेंट प्रोवाइडर्स


ईवेंट प्रदाता ऐसे एप्लिकेशन होते हैं जिनमें ईवेंट ट्रैकिंग टूल होते हैं। प्रदाता द्वारा पंजीकृत होने के बाद, नियंत्रक प्रदाता में इवेंट ट्रैकिंग को सक्षम या अक्षम कर सकता है। प्रदाता पर या बंद की अपनी व्याख्या निर्धारित करता है। आमतौर पर, एक सक्षम प्रदाता घटनाओं को उत्पन्न करता है, लेकिन एक अक्षम प्रदाता नहीं करता है। यह आपको हर समय घटनाओं को उत्पन्न करने की आवश्यकता के बिना हमारे आवेदन में ईवेंट ट्रैकिंग जोड़ने की अनुमति देता है।

एक विक्रेता एक बार में कई ईटीडब्ल्यू सत्रों के साथ अपनी घटनाओं को साझा कर सकता है।

प्रत्येक ईवेंट में दो तत्व होते हैं: हेडर और डेटा! ईवेंट हेडर में ईवेंट के बारे में जानकारी शामिल होती है: प्रदाता पहचानकर्ता, ईवेंट पहचानकर्ता, टाइमस्टैम्प इत्यादि। शेष डेटा एक विशेष प्रदाता द्वारा निर्धारित किया जाता है: ETW किसी भी डेटा को प्राप्त करता है और इसे बफर को लिखता है, और उनकी व्याख्या सूचना के उपभोक्ताओं को सौंपी जाती है।
चार मुख्य प्रकार के प्रदाता हैं:

एमओएफ प्रदाता (क्लासिक)
प्रदाता डब्ल्यूपीपी
प्रदाता, जो प्रकट
प्रदाताओं ट्रेसेगॉगिंग पर आधारित हैं

ईवेंट प्रदाता उन फ़ील्ड्स के प्रकारों में भिन्न होते हैं, जिन्हें वे इवेंट पेलोड में संग्रहीत करते हैं।

इवेंट प्रोवाइडर्स की छंटनी लगती है। आगे बढ़ो!

नियंत्रकों


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

उपभोक्ताओं


उपभोक्ता एक ही समय में एक या अधिक ट्रेस सत्रों से ईवेंट प्राप्त करने और संसाधित करने वाले अनुप्रयोग हैं। उपभोक्ता लॉग फ़ाइलों में संग्रहीत या वास्तविक समय में घटनाओं को वितरित करने वाले सत्रों से प्राप्त कर सकते हैं। जैसा कि हम पहले से ही जानते हैं, एक ईटीडब्ल्यू सत्र में कई आपूर्तिकर्ता हो सकते हैं। सवाल उठता है: क्या भ्रम होगा? विभिन्न ETW सत्रों की घटनाएँ एक-दूसरे से कैसे संबंधित होंगी? घटनाओं को उस समय के अनुसार क्रमबद्ध किया जाता है, जैसे कि प्रणाली कालानुक्रमिक क्रम में घटनाओं का उद्धार करती है!

ETW सत्र


ईवेंट ट्रैकिंग सत्र (ETW सेशन) एक या एक से अधिक प्रदाताओं से ईवेंट रिकॉर्ड करता है जो नियंत्रक अनुमति देता है। सत्र बफ़र्स के प्रबंधन और फ्लशिंग के लिए भी जिम्मेदार है।

ईवेंट ट्रेसिंग एक साथ चलने वाले सत्र के 64 ईवेंट का समर्थन करता है। इन सत्रों में, दो विशेष प्रयोजन सत्र हैं। शेष सत्र सामान्य उपयोग के लिए उपलब्ध हैं। दो विशेष प्रयोजन सत्र:

  • वैश्विक लकड़हारा सत्र
  • NT कर्नेल लकड़हारा सत्र

ग्लोबल लॉगर ईवेंट ट्रेस सत्र घटनाओं को रिकॉर्ड करता है जो ऑपरेटिंग सिस्टम बूट प्रक्रिया की शुरुआत में होते हैं, जैसे कि डिवाइस ड्राइवरों द्वारा उत्पन्न।
NT इवेंट ट्रैकिंग सत्र कर्नेल लकड़हारा ऑपरेटिंग सिस्टम द्वारा उत्पन्न पूर्वनिर्धारित सिस्टम घटनाओं को रिकॉर्ड करता है, जैसे डिस्क I / O ईवेंट या विफलताओं।

तो, अब चलिए अभ्यास करते हैं !!!

आपका ETW सत्र बनाना


काम शुरू करने से पहले, हमें कई उपयोगिताओं का ज्ञान चाहिए, अर्थात्:

एक विशेष ओएस पर उपलब्ध प्रदाताओं की सूची

logman query providers

प्रदाता के बारे में पूरी जानकारी प्राप्त करें

wevtutil gp < > /ge /gm

सभी सक्रिय ईटीडब्ल्यू सत्रों की सूची

xperf -loggers

इसके अलावा, फ़ाइलों को देखने के लिए, नोटपैड ++ की सलाह दी जाती है।

आपके कंप्यूटर पर प्रदाताओं की सूची (और विंडोज 10 पर 1000 से अधिक हैं) को देखने के बाद, हम उनमें से एक को हमारे सत्र के लिए चुनेंगे:

छवि

मैंने Microsoft-Windows-WinINet चुना (यह सेवा Microsoft एज ब्राउज़र में काम करते समय हमारे सभी कार्यों को रिकॉर्ड करती है)।

1. विन + आर -> compmgmt.msc
2. "प्रदर्शन"
3. "डेटा कलेक्टर सेट"
4. "इवेंट ट्रेस सत्र"
5। "नया"
6. "डेटा कलेक्टर सेट"
7. डेटा कलेक्टर का नाम निर्दिष्ट करें
8. "मैन्युअल रूप से बनाएं (उन्नत)" (मैन्युअल रूप से जोड़ें (अनुभवी के लिए) ")

छवि
9. दिलचस्प जोड़ें हमें प्रति सत्र प्रदाता
10. "कीवर्ड्स (कोई भी)" फ़ील्ड में हमारे लिए रुचि के कीवर्ड निर्दिष्ट करें - 0xFFFFFFFFFFFFFFFFFFFFFF
11. लॉगिंग स्तर को निर्दिष्ट करें 0xFF
= छवि

12. सत्र लॉग फ़ाइल को सहेजे जाने वाले पथ का
चयन करें 13. "चुनें" इस डेटा संग्राहक को अभी शुरू करें "(अब डेटा कलेक्टरों के समूह को चलाएं")

अब वह सत्र जो हमने बनाया है। Microsoft Edge को हमारे बारे में जानकारी इकट्ठा करने के लिए सत्र प्राप्त करने के लिए कुछ काम करने की आवश्यकता है!

कुछ समय बीत जाने के बाद, हम उस जगह पर जाते हैं जहाँ हमने लॉग फाइल को सेव किया था। हम वहां निम्न कमांड निष्पादित करते हैं।

tracerpt "   .etl" -o -report -summary -lr

इस कमांड को निष्पादित करने के बाद, 4 फाइलें उत्पन्न होंगी।

छवि

वर्तमान में हम डंपफाइल.एक्सएमएल में रुचि रखते हैं। आप इस फाइल को या तो नोटपैड ++ के माध्यम से खोल सकते हैं, आप एक्सेल में भी कर सकते हैं।

इस फ़ाइल का ध्यानपूर्वक अध्ययन करने पर, आप देख सकते हैं कि इस सत्र ने इंटरनेट पर हमारे आंदोलन के बारे में लगभग पूरी जानकारी एकत्र कर ली है !!! आप यहां इसके बारे में अधिक पढ़ सकते हैं। हम ETW का अध्ययन करते हैं और मुनाफा निकालते हैं

खैर, और हम आगे बढ़ते हैं। हमने केवल एक ईवेंट प्रदाता के साथ एक सत्र बनाया। लॉग फ़ाइल से सत्र डेटा प्राप्त किया। यह कोड का समय है!

ईटीडब्ल्यू के साथ काम करने के लिए ईवेंट ट्रेसिंग एपीआई का उपयोग करना


हब्र पर एक दिलचस्प लेख है, सबसे खराब एपीआई जिसे कभी बनाया गया था

इस लेख में आपको कई सवालों के जवाब मिलेंगे जो कि आपको आवेदन लिखते समय सबसे अधिक संभावना होगी!

हम C ++ में कोड करेंगे।

सबसे सरल से शुरू करते हैं।

कॉन्फ़िगर करें और एक इवेंट ट्रैकिंग सत्र शुरू करें


सबसे पहले, सामान्य विचार पर विचार करें।

ट्रेस सत्र प्रारंभ करने के लिए:

1) संरचना सेट करें EVENT_TRACE_PROPERTIES

2) स्टार्टट्रेस का उपयोग करके सत्र प्रारंभ
करें, इवेंट प्रदाताओं को सक्षम

करें 3) EnableTrace का उपयोग करके प्रदाताओं को चालू करें। EnableTraceEx | EnableTraceEx2
ट्रेस सत्र को रोकने के लिए, आपको:

4) ट्रेस सत्र को रोकने से पहले, आपको EnableTrace का उपयोग करके प्रदाताओं को अक्षम करना होगा। EnableTraceEx | EnableTraceEx2, EVENT_CONTROL_CODE_DISABLE_PROVIDER

5 पास करना) कंट्रोलट्रेस फ़ंक्शन को कॉल करें और इसे पारित करें EVENT_TRACE_CONTROL_STOP

नीचे दिए गए उदाहरण में, मैं MyEventTraceSession नामक एक सत्र बना रहा हूं। वर्तमान निर्देशिका में लॉग फ़ाइल को WriteThePuth.etl कहा जाता है।

ईवेंट प्रदाता Microsoft-Windows- कर्नेल-प्रक्रिया है। आप अपने GUID का उपयोग करके पता लगा सकते हैं

wevtutil gp Microsoft-Windows-Kernel-Process /ge /gm

सीधे कोड:

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <strsafe.h>
#include <wmistr.h>
#include <evntrace.h>
#include <iostream>
#define LOGFILE_PATH L"WriteThePuth.etl"
#define LOGSESSION_NAME L"MyEventTraceSession"


// GUID,     .
//      GUID .

// {AE44CB98-BD11-4069-8093-770EC9258A12}
static const GUID SessionGuid =
{ 0xae44cb98, 0xbd11, 0x4069, { 0x80, 0x93, 0x77, 0xe, 0xc9, 0x25, 0x8a, 0x12 } };


// GUID,   ,   
//    .

//{22FB2CD6-0E7B-422B-A0C7-2FAD1FD0E716} Microsoft-Windows-Kernel-Process
static const GUID ProviderGuid =
{ 0xd22FB2CD6, 0x0E7B, 0x422B, {0xA0, 0xC7, 0x2F, 0xAD, 0x1F, 0xD0, 0xE7, 0x16 } };

void wmain(void)
{
    setlocale(LC_ALL, "ru");
    ULONG status = ERROR_SUCCESS;
    TRACEHANDLE SessionHandle = 0;
    EVENT_TRACE_PROPERTIES* pSessionProperties = NULL;
    ULONG BufferSize = 0;
    BOOL TraceOn = TRUE;

    
    BufferSize = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGFILE_PATH) + sizeof(LOGSESSION_NAME);
    pSessionProperties = (EVENT_TRACE_PROPERTIES*)malloc(BufferSize);
    if (NULL == pSessionProperties)
    {
        wprintf(L"Unable to allocate %d bytes for properties structure.\n", BufferSize);
        goto cleanup;
    }

    ZeroMemory(pSessionProperties, BufferSize);
    pSessionProperties->Wnode.BufferSize = BufferSize;
    pSessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
    pSessionProperties->Wnode.ClientContext = 1; //QPC clock resolution
    pSessionProperties->Wnode.Guid = SessionGuid;
    pSessionProperties->LogFileMode = EVENT_TRACE_FILE_MODE_SEQUENTIAL;
    pSessionProperties->MaximumFileSize = 1024;  // 1024 MB
    pSessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
    pSessionProperties->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGSESSION_NAME);
    StringCbCopy((LPWSTR)((char*)pSessionProperties + pSessionProperties->LogFileNameOffset), sizeof(LOGFILE_PATH), LOGFILE_PATH);
    

    status = StartTrace((PTRACEHANDLE)&SessionHandle, LOGSESSION_NAME, pSessionProperties);
    if (ERROR_SUCCESS != status)
    {
        wprintf(L"StartTrace() failed with %lu\n", status);
        goto cleanup;
    }

    //  ,   ,      .

    status = EnableTraceEx2(
        SessionHandle,
        (LPCGUID)&ProviderGuid,
        EVENT_CONTROL_CODE_ENABLE_PROVIDER,
        TRACE_LEVEL_INFORMATION,
        0,
        0,
        0,
        NULL
        );

    if (ERROR_SUCCESS != status)
    {
        wprintf(L"EnableTrace() failed with %lu\n", status);
        TraceOn = FALSE;
        goto cleanup;
    }

    //   .    ,   
    wprintf(L"Run the provider application. Then hit any key to stop the session.\n");
    _getch();
   

cleanup:
    if (SessionHandle)
    {
        if (TraceOn)
        {
            status = EnableTraceEx2(
                SessionHandle,
                (LPCGUID)&ProviderGuid,
                EVENT_CONTROL_CODE_DISABLE_PROVIDER,
                TRACE_LEVEL_INFORMATION,
                0,
                0,
                0,
                NULL
                );
        }

        status = ControlTrace(SessionHandle, LOGSESSION_NAME, pSessionProperties, EVENT_TRACE_CONTROL_STOP);

        if (ERROR_SUCCESS != status)
        {
            wprintf(L"ControlTrace(stop) failed with %lu\n", status);
        }
    }

    if (pSessionProperties)
    {
        free(pSessionProperties);
        pSessionProperties = NULL;
    }
}

हम उपरोक्त कार्यक्रम का अधिक विस्तार से विश्लेषण करेंगे।

1) EVENT_TRACE_PROPERTIES संरचना सेट

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

2) प्रारंभ सत्र का उपयोग करके सत्र प्रारंभ करें सत्र का

गुण निर्दिष्ट करने के बाद, सत्र प्रारंभ करने के लिए प्रारंभ फ़ंक्शन को कॉल करें। यदि फ़ंक्शन सफल होता है, तो सत्रहैंडल पैरामीटर में सत्र विवरणक होगा, और LoggerNameOffset संपत्ति में सत्र नाम ऑफसेट होगा।

3) EnableTrace का उपयोग करने वाले प्रदाताओं को चालू करें EnableTraceEx | EnableTraceEx2

उन प्रदाताओं को सक्षम करने के लिए जिन्हें आप अपने सत्र में रिकॉर्डिंग की घटनाओं की अनुमति देना चाहते हैं, क्लासिक प्रदाताओं को सक्षम करने के लिए EnableTrace फ़ंक्शन को कॉल करें, और EnableTraceEx फ़ंक्शन को प्रकट-आधारित प्रदाताओं को सक्षम करने के लिए। अन्य मामलों में - EnableTraceEx2।

4) ट्रेस सत्र को रोकने से पहले, आपको EnableTrace का उपयोग करके प्रदाताओं को अक्षम करना होगा EnableTraceEx | EVENT_CONTROL_CODE_DISABLE_PROVIDER पास करके EnableTraceEx2

घटनाओं को इकट्ठा करने के बाद ट्रेस सत्र को रोकने के लिए, कंट्रोलट्रेस फ़ंक्शन को कॉल करें और नियंत्रण कोड के रूप में EVENT_TRACE_CONTROL_STOP पास करें। एक सत्र को रोकने के लिए निर्दिष्ट करने के लिए, आप इवेंट ट्रेस सत्र डिस्क्रिप्टर को पहले कॉल से प्राप्त स्टार्टट्रेस फ़ंक्शन या पहले से शुरू किए गए सत्र के नाम से पारित कर सकते हैं। सत्र रोकने से पहले सभी प्रदाताओं को डिस्कनेक्ट करना सुनिश्चित करें। यदि आप पहली बार प्रदाता को बंद करने से पहले सत्र बंद कर देते हैं, तो ETW प्रदाता को डिस्कनेक्ट कर देगा और प्रदाता कॉलिंग कंट्रोल फ़ंक्शन को कॉल करने का प्रयास करेगा। यदि सत्र शुरू करने वाला एप्लिकेशन प्रदाता को डिस्कनेक्ट किए बिना या कंट्रोलट्रेस फ़ंक्शन को कॉल किए बिना समाप्त हो जाता है, तो प्रदाता चालू रहता है।

5) ट्रेस सत्र को रोकने के लिए, कंट्रोलट्रेस फ़ंक्शन को कॉल करें और इसे EVENT_TRACE_CONTROL_STOP पास करें

जैसा कि हमने ऊपर उदाहरण में देखा, इवेंट ट्रेसिंग एपीआई का उपयोग करना सबसे आसान नहीं है। आप जो करते हैं उसके आधार पर, आप ईवेंट प्रदाता लिखना जारी रख सकते हैं या ईवेंट उपभोक्ता लिख ​​सकते हैं। हालाँकि, ये दोनों कार्य काफी मात्रा में हैं और इस लेख में इस पर विचार नहीं किया जाएगा! अतिरिक्त जटिलता 4 प्रकार के ईवेंट प्रदाताओं द्वारा बनाई गई है, और तदनुसार, घटनाओं को लिखने के लिए 4 विकल्प और उनके उपभोग के लिए 4 विकल्प। इवेंट ट्रेसिंग एपीआई के साथ काम को बहुत विस्तार से और अच्छी तरह से आधिकारिक Microsoft वेबसाइट पर ईवेंट ट्रेसिंग का उपयोग करके वर्णित किया

गया है। ईवेंट ट्रेसिंग एपीआई के साथ कुछ समय के लिए काम करने के बाद, मेरे पास एक सवाल था: क्या कोई उपयोगिताओं हैं जो मेरे जीवन को सरल बनाएंगे?

ETW के साथ काम करने के लिए ट्रेसरप्ट और xperf का उपयोग करना


इस अध्याय में, मैं इन उपयोगिताओं को सैद्धांतिक दृष्टिकोण से नहीं मानूंगा।

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

tracerpt " 1- .etl" ... " n- .etl" -o <   > -report <    > -summary<    > 

Xperf.exe उपयोगिता एक पूर्ण-नियंत्रक है। यह ETW प्रदाताओं और सत्रों के प्रबंधन के लिए कमांड लाइन तर्कों का समर्थन करता है। नियंत्रक वर्तमान में सक्रिय सत्रों की स्थिति का अनुरोध कर सकते हैं और सिस्टम में पंजीकृत सभी प्रदाताओं की सूची प्राप्त कर सकते हैं। उदाहरण के लिए, सभी सक्रिय सत्रों को प्राप्त करने के लिए, निम्नलिखित कमांड का उपयोग करें:

C:\>xperf -loggers

और सिस्टम में पंजीकृत सभी प्रदाताओं की सूची प्राप्त करने के लिए, कमांड का उपयोग करें:

C:\>xperf -providers

नियंत्रकों में कुछ प्रमुख विशेषताएं हैं। वे सत्र को अपडेट कर सकते हैं और बफ़र्स को डिस्क पर फ्लश कर सकते हैं।

अभी के लिए इतना ही!

दुर्भाग्य से, इस लेख में मैंने कई दिलचस्प मुद्दों (उदाहरण के लिए, वास्तविक समय में घटनाओं की खपत या विशेष प्रयोजन सत्रों के साथ काम करना) को संबोधित नहीं किया।

आप इसके बारे में निम्नलिखित साइटों पर पढ़ सकते हैं:

इवेंट ट्रेसिंग - आधिकारिक Microsoft प्रलेखन।
हम ETW का अध्ययन करते हैं और
बुराई पक्ष पर विंडोज के लिए ईवेंट ट्रेसिंग के लाभों को निकालते हैं लेकिन यह अभी
तक बनाई गई सबसे खराब एपीआई नहीं है

All Articles