Freigeben über


FunctionTailcall2-Funktion

Aktualisiert: November 2007

Benachrichtigt den Profiler, dass die zurzeit ausgeführte Funktion im Begriff ist, einen Endeaufruf einer anderen Funktion durchzuführen, und stellt Informationen über den Stapelrahmen bereit.

void FunctionTailcall2 (
        [in] FunctionID         funcId, 
        [in] UINT_PTR           clientData, 
        [in] COR_PRF_FRAME_INFO func
);

Parameter

  • funcId
    [in] Der Bezeichner der aktuell ausgeführten Funktion, die im Begriff ist, einen Endeaufruf durchzuführen.

  • clientData
    [in] Der neu zugeordnete Funktionsbezeichner der aktuell ausgeführten Funktion, die im Begriff ist, einen Endeaufruf durchzuführen; dieser wurde zuvor über FunctionIDMapper vom Profiler angegeben.

  • func
    [in] Ein COR_PRF_FRAME_INFO-Wert, der auf Informationen über den Stapelrahmen zeigt.

    Der Profiler sollte diesen Wert als nicht transparentes Handle behandeln, das in der ICorProfilerInfo2::GetFunctionInfo2-Methode an das Ausführungsmodul zurückgegeben werden kann.

Hinweise

Die Zielfunktion des Endeaufrufs verwendet den aktuellen Stapelrahmen und kehrt direkt zu dem Aufrufer der Funktion zurück, die den Endeaufruf ausgeführt hat. Dies bedeutet, dass für eine Funktion, die das Ziel eines Endeaufrufs ist, kein FunctionLeave2-Rückruf ausgegeben wird.

Der Wert des func-Parameters ist nach der Rückkehr der FunctionTailcall2-Funktion nicht gültig, da der Wert möglicherweise geändert oder zerstört wurde.

Die FunctionTailcall2-Funktion ist ein Rückruf; Sie müssen sie implementieren. Die Implementierung muss das __declspec(naked)-Speicherklassenattribut verwenden.

Das Ausführungsmodul speichert vor dem Aufrufen dieser Funktion keine Register.

  • Beim Eintritt müssen Sie alle verwendeten Register speichern, auch die Register in der Gleitkommaeinheit (Floating-Point Unit, FPU).

  • Beim Beenden müssen Sie den Stapel wiederherstellen, indem Sie alle Parameter, die vom Aufrufer verschoben wurden, wieder abholen.

Die Implementierung von FunctionTailcall2 sollte nicht blockieren, da dies die Garbage Collection verzögert. Die Implementierung sollte nicht versuchen, eine Garbage Collection durchzuführen, weil sich der Stapel möglicherweise nicht in einem für die Garbage Collection geeigneten Zustand befindet. Wenn eine Garbage Collection versucht wird, ist die Laufzeit blockiert, bis FunctionTailcall2 zurückkehrt.

Außerdem darf die FunctionTailcall2-Funktion keinen verwalteten Code aufrufen und keinen verwalteten Speicher reservieren.

Anforderungen

Plattformen: siehe Systemanforderungen für .NET Framework.

Header: CorProf.idl

Bibliothek: CorGuids.lib

.NET Framework-Versionen: 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0

Siehe auch

Referenz

FunctionEnter2-Funktion

FunctionLeave2-Funktion

ICorProfilerInfo2::SetEnterLeaveFunctionHooks2-Methode

Weitere Ressourcen

Profilerstellung für globale statische Funktionen