ICorProfilerInfo2::D oStackSnapshot-metod

Vägleder de hanterade ramarna i stacken för den angivna tråden och skickar information till profileraren via ett återanrop.

Syntax

HRESULT DoStackSnapshot(  
    [in] ThreadID thread,  
    [in] StackSnapshotCallback *callback,  
    [in] ULONG32 infoFlags,  
    [in] void *clientData,  
    [in, size_is(contextSize), length_is(contextSize)] BYTE context[],  
    [in] ULONG32 contextSize);  

Parametrar

thread
[i] Måltrådens ID.

Om du skickar null i thread får du en ögonblicksbild av den aktuella tråden. Om en ThreadID annan tråd skickas pausar CLR (Common Language Runtime) tråden, utför ögonblicksbilden och återupptas.

callback
[i] En pekare på implementeringen av metoden StackSnapshotCallback , som anropas av CLR för att ge profileraren information om varje hanterad ram och varje körning av ohanterade ramar.

Metoden StackSnapshotCallback implementeras av profileraren.

infoFlags
[i] Ett värde för COR_PRF_SNAPSHOT_INFO uppräkning, som anger hur mycket data som ska skickas tillbaka för varje bildruta av StackSnapshotCallback.

clientData
[i] En pekare till klientdata, som skickas direkt till återanropsfunktionen StackSnapshotCallback .

context
[i] En pekare till en Win32-struktur CONTEXT som används för att seeda stackvandringen. Win32-strukturen CONTEXT innehåller värden för CPU-register och representerar cpu-tillståndet vid en viss tidpunkt.

Fröet hjälper CLR att avgöra var stacken ska börja, om toppen av stacken är ohanterad hjälpkod; Annars ignoreras fröet. Ett frö måste anges för en asynkron genomgång. Om du gör en synkron promenad är inget frö nödvändigt.

Parametern context är endast giltig om flaggan COR_PRF_SNAPSHOT_CONTEXT skickades i parametern infoFlags .

contextSize
[i] Strukturens CONTEXT storlek, som refereras av parametern context .

Kommentarer

Om du skickar null för thread får du en ögonblicksbild av den aktuella tråden. Ögonblicksbilder kan endast tas av andra trådar om måltråden pausas vid den tidpunkten.

När profileraren vill gå i stacken anropas DoStackSnapshot. Innan CLR returnerar från det anropet anropas dina StackSnapshotCallback flera gånger, en gång för varje hanterad ram (eller körning av ohanterade ramar) i stacken. När ohanterade ramar påträffas måste du själv följa dem.

Den ordning som stacken vandras i är den omvända av hur ramarna trycktes på stacken: lövram (senast pushed) ram först, huvudram (först pushed) bildruta sist.

Mer information om hur du programmerar profileraren att gå hanterade staplar finns i Profiler Stack Walking i .NET Framework 2.0: Basics and Beyond.

En stackvandring kan vara synkron eller asynkron, enligt beskrivningen i följande avsnitt.

Synkron stack-promenad

En synkron stackvandring innebär att du går i stacken för den aktuella tråden som svar på ett återanrop. Det kräver inte seeding eller suspendering.

Du gör ett synkront anrop när du som svar på CLR anropar någon av profilerarens ICorProfilerCallback-metoder (eller ICorProfilerCallback2) och anropar DoStackSnapshot för att gå i stacken för den aktuella tråden. Det här är användbart när du vill se hur stacken ser ut vid ett meddelande som ICorProfilerCallback::ObjectAllocated. Du anropar DoStackSnapshot bara inifrån metoden ICorProfilerCallback och skickar null-parametrarna context och thread .

Asynkron stackvandring

En asynkron stackgång innebär att du går i stacken på en annan tråd eller går i stacken på den aktuella tråden, inte som svar på en motringning, utan genom att kapa den aktuella trådens instruktionspekare. En asynkron genomgång kräver ett startvärde om toppen av stacken är ohanterad kod som inte ingår i ett PInvoke-anrop (plattformsanrop) eller COM-anrop, utan hjälpkod i själva CLR. Kod som till exempel gör just-in-time-kompilering (JIT) eller skräpinsamling är hjälpkod.

Du får ett frö genom att direkt pausa måltråden och gå sin stack själv, tills du hittar den översta hanterade ramen. När måltråden har pausats hämtar du måltrådens aktuella registerkontext. Bestäm sedan om registerkontexten pekar på ohanterad kod genom att anropa ICorProfilerInfo::GetFunctionFromIP – om den returnerar lika FunctionID med noll är ramen ohanterad kod. Gå nu i stacken tills du når den första hanterade ramen och beräkna sedan seed-kontexten baserat på registerkontexten för den ramen.

Anropa DoStackSnapshot med startkontexten för att påbörja den asynkrona stackvandringen. Om du inte anger ett frö kan DoStackSnapshot du hoppa över hanterade ramar överst i stacken och därmed ge dig en ofullständig stackvandring. Om du anger ett frö måste det peka på JIT-kompilerad eller intern avbildningsgenerator (Ngen.exe)-genererad kod. annars DoStackSnapshot returnerar felkoden CORPROF_E_STACKSNAPSHOT_UNMANAGED_CTX.

Asynkrona stackvandringar kan enkelt orsaka dödlägen eller åtkomstöverträdelser, såvida du inte följer dessa riktlinjer:

  • När du inaktiverar trådar direkt bör du komma ihåg att endast en tråd som aldrig har kört hanterad kod kan pausa en annan tråd.

  • Blockera alltid i din ICorProfilerCallback::ThreadDestroyed motringning tills trådens stackvandring är klar.

  • Håll inte ett lås medan profileraren anropar en CLR-funktion som kan utlösa en skräpinsamling. Håll alltså inte ett lås om den ägande tråden kan göra ett anrop som utlöser en skräpinsamling.

Det finns också risk för dödläge om du anropar DoStackSnapshot från en tråd som profileraren har skapat så att du kan gå i stacken för en separat måltråd. Första gången tråden du skapade anger vissa ICorProfilerInfo* metoder (inklusive DoStackSnapshot) utför CLR en CLR-specifik initiering per tråd på tråden. Om profileraren har pausat måltråden vars stack du försöker gå, och om måltråden råkade äga ett lås som krävs för att utföra den här initieringen per tråd, uppstår ett dödläge. Undvik det här dödläget genom att göra ett första anrop till DoStackSnapshot från din profilerarskapade tråd för att gå en separat måltråd, men pausa inte måltråden först. Det här första anropet säkerställer att initieringen per tråd kan slutföras utan dödläge. Om DoStackSnapshot lyckas och rapporterar minst en bildruta efter det är det säkert för den profilerareskapade tråden att pausa alla måltrådar och anropa DoStackSnapshot för att gå i stacken för måltråden.

Krav

Plattformar: Se Systemkrav.

Huvudet: CorProf.idl, CorProf.h

Bibliotek: CorGuids.lib

.NET Framework versioner: Tillgänglig sedan 2.0

Se även