AMcoder - javascript, python, java, html, php, sql

Ինչպե՞ս կապել RPC զանգերը ETW հետքերում:

Ես Windows-ում տեղական RPC զանգեր կատարող հավելվածի հետք եմ գրանցել: Ես օգտագործել եմ xperf՝ միացված Microsoft-Windows-RPC մատակարարով: Հետքը բացելուց հետո ես հասկացա, որ հաճախորդի և սերվերի զանգերը փոխկապակցելը այնքան էլ պարզ չէ: Ավելի հեշտ կլինի բացատրել խնդիրը օրինակով:

Հաճախորդի կողմից ուղարկված RpcClientCall իրադարձություններից մեկն ունի հետևյալ տեսքը.

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <System>
        <Provider Name="Microsoft-Windows-RPC" Guid="{6ad52b32-d609-4be9-ae07-ce8dae937e39}" />
        <EventID>5</EventID>
        <Version>1</Version>
        <Level>4</Level>
        <Task>1</Task>
        <Opcode>1</Opcode>
        <Keywords>0x4000000000000000</Keywords>
        <TimeCreated SystemTime="2017-01-02T18:21:54.825009200+0059" />
        <Correlation ActivityID="{f9ace53a-28fe-4129-ac24-8d04ea0a79a9}" />
        <Execution ProcessID="10688" ThreadID="5384" ProcessorID="7" KernelTime="30" UserTime="15" />
        <Channel>Microsoft-Windows-RPC/Debug</Channel>
        <Computer />
    </System>
    <EventData>
        <Data Name="InterfaceUuid">{e60c73e6-88f9-11cf-9af1-0020af6e72f4}</Data>
        <Data Name="ProcNum">0x8</Data>
        <Data Name="Protocol">       3</Data>
        <Data Name="NetworkAddress">NULL</Data>
        <Data Name="Endpoint">epmapper</Data>
        <Data Name="Options">NULL</Data>
        <Data Name="AuthenticationLevel">       6</Data>
        <Data Name="AuthenticationService">      20</Data>
        <Data Name="ImpersonationLevel">       3</Data>
    </EventData>
    <RenderingInfo Culture="en-US">
        <Level>Information </Level>
        <Opcode>Start </Opcode>
        <Task>RpcClientCall</Task>
        <Message>Client RPC call started.   InterfaceUuid:  {e60c73e6-88f9-11cf-9af1-0020af6e72f4}  OpNum:  0x8     Protocol:   LRPC    NetworkAddress  NULL    Endpoint    epmapper    Binding Options     NULL    Authentication Level    7   Authentication Service  8 Impersonation Level   9 </Message>
        <Channel>Debug </Channel>
        <Provider>Microsoft-Windows-RPC </Provider>
    </RenderingInfo>
</Event>

Այնուհետև գալիս են մի շարք Վրիպազերծում իրադարձություններ (նույն ActivityID-ով), ինչպիսին է սա.

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <System>
        <Provider Name="Microsoft-Windows-RPC" Guid="{6ad52b32-d609-4be9-ae07-ce8dae937e39}" />
        <EventID>4</EventID>
        <Version>1</Version>
        <Level>5</Level>
        <Task>3</Task>
        <Opcode>0</Opcode>
        <Keywords>0x4000000000000000</Keywords>
        <TimeCreated SystemTime="2017-01-02T18:21:54.825028400+0059" />
        <Correlation ActivityID="{f9ace53a-28fe-4129-ac24-8d04ea0a79a9}" />
        <Execution ProcessID="10688" ThreadID="5384" ProcessorID="7" KernelTime="30" UserTime="15" />
        <Channel>Microsoft-Windows-RPC/Debug</Channel>
        <Computer />
    </System>
    <EventData>
        <Data Name="Subject">76</Data>
        <Data Name="Verb">75</Data>
        <Data Name="SubjectPointer">0x24F9A52CAF0</Data>
        <Data Name="ObjectPointer">0x180</Data>
        <Data Name="DataPointer">0x22000130</Data>
    </EventData>
    <RenderingInfo Culture="en-US">
        <Level>Verbose </Level>
        <Task>Debug</Task>
        <Message>RPC Log Event. 
    Subject:    ALPC    Verb:   PKT_OUT     SubjectPointer:     0x24F9A52CAF0   ObjectPointer:  0x180   Data:   0x22000130 </Message>
        <Channel>Debug </Channel>
        <Provider>Microsoft-Windows-RPC </Provider>
    </RenderingInfo>
</Event>

Ավելի ուշ ես կարող եմ գտնել RpcServerCall իրադարձությունը, որը հավանաբար ներկայացնում է սերվերի պատասխանը.

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <System>
        <Provider Name="Microsoft-Windows-RPC" Guid="{6ad52b32-d609-4be9-ae07-ce8dae937e39}" />
        <EventID>6</EventID>
        <Version>1</Version>
        <Level>4</Level>
        <Task>2</Task>
        <Opcode>1</Opcode>
        <Keywords>0x4000000000000000</Keywords>
        <TimeCreated SystemTime="2017-01-02T18:21:56.786737300+0059" />
        <Correlation ActivityID="{11bb1d8d-336f-44e3-b853-b903f4fd2651}" />
        <Execution ProcessID="652" ThreadID="15348" ProcessorID="4" KernelTime="90" UserTime="195" />
        <Channel>Microsoft-Windows-RPC/Debug</Channel>
        <Computer />
    </System>
    <EventData>
        <Data Name="InterfaceUuid">{e60c73e6-88f9-11cf-9af1-0020af6e72f4}</Data>
        <Data Name="ProcNum">0x8</Data>
        <Data Name="Protocol">       3</Data>
        <Data Name="NetworkAddress">NULL</Data>
        <Data Name="Endpoint">epmapper</Data>
        <Data Name="Options">NULL</Data>
        <Data Name="AuthenticationLevel">       6</Data>
        <Data Name="AuthenticationService">      20</Data>
        <Data Name="ImpersonationLevel">       0</Data>
    </EventData>
    <RenderingInfo Culture="en-US">
        <Level>Information </Level>
        <Opcode>Start </Opcode>
        <Task>RpcServerCall</Task>
        <Message>Server RPC call started.   InterfaceUuid:  {e60c73e6-88f9-11cf-9af1-0020af6e72f4}  OpNum:  0x4     Protocol:   LRPC    Endpoint    epmapper    Authentication Level    7   Authentication Service  8 </Message>
        <Channel>Debug </Channel>
        <Provider>Microsoft-Windows-RPC </Provider>
    </RenderingInfo>
</Event>

Այս իրադարձությանը կրկին հաջորդում են մի շարք Վրիպազերծում իրադարձություններ (նույն ActivityID-ով).

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <System>
        <Provider Name="Microsoft-Windows-RPC" Guid="{6ad52b32-d609-4be9-ae07-ce8dae937e39}" />
        <EventID>4</EventID>
        <Version>1</Version>
        <Level>5</Level>
        <Task>3</Task>
        <Opcode>0</Opcode>
        <Keywords>0x4000000000000000</Keywords>
        <TimeCreated SystemTime="2017-01-02T18:21:56.786747500+0059" />
        <Correlation ActivityID="{11bb1d8d-336f-44e3-b853-b903f4fd2651}" />
        <Execution ProcessID="652" ThreadID="15348" ProcessorID="4" KernelTime="90" UserTime="195" />
        <Channel>Microsoft-Windows-RPC/Debug</Channel>
        <Computer />
    </System>
    <EventData>
        <Data Name="Subject">105</Data>
        <Data Name="Verb">43</Data>
        <Data Name="SubjectPointer">0x15B5283A110</Data>
        <Data Name="ObjectPointer">0x0</Data>
        <Data Name="DataPointer">0x1</Data>
    </EventData>
    <RenderingInfo Culture="en-US">
        <Level>Verbose </Level>
        <Task>Debug</Task>
        <Message>RPC Log Event. 
    Subject:    IF      Verb:   INC     SubjectPointer:     0x15B5283A110   ObjectPointer:  0x0     Data:   0x1 </Message>
        <Channel>Debug </Channel>
        <Provider>Microsoft-Windows-RPC </Provider>
    </RenderingInfo>
</Event>

Զանգն ավարտվելուց հետո ես կարող եմ տեսնել win:stop իրադարձություններ և՛ հաճախորդի, և՛ սերվերի վրա, բայց այդ իրադարձություններն ունեն միայն մեկ դաշտ՝ Status և ActivityID սահմանվել է նույն արժեքը, ինչ win:start իրադարձությունը, օրինակ՝

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <System>
        <Provider Name="Microsoft-Windows-RPC" Guid="{6ad52b32-d609-4be9-ae07-ce8dae937e39}" />
        <EventID>8</EventID>
        <Version>1</Version>
        <Level>4</Level>
        <Task>2</Task>
        <Opcode>2</Opcode>
        <Keywords>0x4000000000000000</Keywords>
        <TimeCreated SystemTime="2017-01-02T18:21:56.786835000+0059" />
        <Correlation ActivityID="{11bb1d8d-336f-44e3-b853-b903f4fd2651}" />
        <Execution ProcessID="652" ThreadID="15348" ProcessorID="4" KernelTime="90" UserTime="195" />
        <Channel>Microsoft-Windows-RPC/Debug</Channel>
        <Computer />
    </System>
    <EventData>
        <Data Name="Status">0x0</Data>
    </EventData>
    <RenderingInfo Culture="en-US">
        <Level>Information </Level>
        <Opcode>Stop </Opcode>
        <Task>RpcServerCall</Task>
        <Message>Server RPC call was completed.     Status:     0x0 </Message>
        <Channel>Debug </Channel>
        <Provider>Microsoft-Windows-RPC </Provider>
    </RenderingInfo>
</Event>

Հարց

Վերջապես, հարցս հետևյալն է. ինչպե՞ս կարող եմ 100%-ով վստահ լինել, որ տրված RpcServerCall-ը պատասխան է իմ սկզբնական RpcClientCall-ին: Կարծում եմ, որ InterfaceUuid, ProcNum, Protocol և Endpoint համապատասխանությունը բավարար չէ, քանի որ այնտեղ կարող է լինել մի քանի զանգ տվյալ վերջնակետին միաժամանակ: Հուսով եմ, որ գուցե այս Վրիպազերծման իրադարձությունները կարող են օգնել այստեղ: Գուցե կա մեկ այլ ETW մատակարար, որը ես պետք է օգտագործեմ: Կամ գուցե կա կարգավորում RelativeActivityId-ը միացնելու համար:

06.01.2017

  • Փորձո՞ւմ եք պարզել, թե ինչու է RPC զանգն այդքան երկար տևում կամ կոնկրետ ինչի՞ց եք հետևում: Սովորաբար դուք չեք ցանցում այս նյութերը, եթե ցանկանում եք իմանալ, թե ինչն է արգելափակել ձեզ որքան ժամանակ: Դուք կարող եք օգտագործել Context Switch-ի իրադարձությունները (CPU Usage Precise), որոնք ձեզ հստակ կասեն, թե որքան երկար է սպասել շարանը, մինչև ինչ-որ բան ավարտվի: 06.01.2017
  • Ես աշխատում եմ տվյալ գործընթացի համար ETW հետքերը ցուցադրելու գործիքի վրա՝ github.com/lowleveldesign/wtrace, և ես կցանկանայի ունենալ ոչ միայն հաճախորդի կողմից կատարված զանգերը, այլև սերվերի պատասխանները: 06.01.2017

Պատասխանները:


1

Դուք կարող եք կապել իրադարձությունները՝ միացնելով Microsoft-Windows-RPC-ն և խմբավորել ըստ Activity Id-ի, որը եզակի կլինի յուրաքանչյուր RPC զանգի համար: Դուք այնուհետև պետք է միայն փոխկապակցեք մեկնարկի/դադարեցման իրադարձությունները յուրաքանչյուր գործունեության ID-ի համար, որը կարող եք ունենալ ձեր հաճախորդի գործընթացի համատեքստում՝ ցանկացած RPC զանգի տևողությունը փոխկապակցելու համար:

Յուրաքանչյուր Գործունեության համար շատ վրիպազերծման իրադարձություններ կարող են գրանցվել, բայց այնտեղ կլինի միայն մեկ start/stop tuple: Դա պետք է կատարի հնարքը:

մուտքագրեք պատկերի նկարագրությունը այստեղ

RPC հաճախորդի և սերվերի զանգերը փոխկապակցելու համար նախ անհրաժեշտ է գտնել համապատասխան RPC հաճախորդի և սերվերի զանգերը՝ դիտելով մեկնարկի/դադարեցման իրադարձությունները նույն գործունեության ուղեցույցով: Տրված RpcClient-ի համար RpcServer-ով զանգով կարող եք օգտագործել դաշտ 5 (վերջնական կետ)՝ ըստ նրանց խմբավորման: Համենայն դեպս, դա այն է, ինչ ես գտել եմ, կարծես հուսալի ցուցանիշ է, եթե տվյալ վերջնակետը սպասարկում է զանգերը միայն համաժամանակյա: Ինտերֆեյսը կարող է նաև աշխատել, բայց քանի որ կարող է լինել մեկից ավելի COM սերվեր, որը միաժամանակ աշխատում է նույն ինտերֆեյսի GUID-ով, դա հուսալի ցուցանիշ չէ: Չեմ կարծում, որ տվյալ տվյալներով դրանից շատ ավելի լավ կլինի։ Ինչո՞ւ եք այդքան հետաքրքրված RPC սերվերի մասով: Սովորաբար դուք կնայեիք միայն հաճախորդի շատ երկար ժամանակներին, ինչը, այնուամենայնիվ, բավարար է ավելի խորը վերլուծություն սկսելու համար: Փնտրու՞մ եք խնդիրներ RPC ենթակառուցվածքի ներսում:

մուտքագրեք պատկերի նկարագրությունը այստեղ

07.01.2017
  • Շնորհակալություն ձեր պատասխանի համար: Ցավոք, դա չի լուծում հարցի խնդիրը։ Այն աշխատում է միայն RpcClientCall-ի վրա, ուստի այս կերպ մենք կարող ենք փոխկապակցել միայն հաճախորդի կողմից արված հարցումները: Ես կցանկանայի փոխկապակցել հաճախորդի զանգը սերվերի պատասխանի հետ, այնպես որ ինչ-որ ընդհանուր բան RpcClientCall-ի (երկուսն էլ՝ win:start/win: end) և RpcServerCall-ի միջև (երկուսն էլ՝ win:start/win: end) միջև: 07.01.2017
  • Ավելացվեց նաև RPC հաճախորդի սերվերի հարաբերակցությունը: 07.01.2017
  • Ինչպես նախկինում ասացի, իմ նպատակն է իրականացնել ավտոմատ հայտնաբերում իմ գործիքում: Ձեր գրածը նաև իմ վերջնական ենթադրությունն է։ Ձեր պատասխանը նշում եմ որպես պատասխան, քանի որ հետաքննության ընթացքում, հավանաբար, հնարավոր չէ ավելի հեռուն գնալ: Շնորհակալություն 07.01.2017
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..