.call (Aufruffunktion)

Der Befehl .call bewirkt, dass der Zielprozess eine Funktion ausführt.

.call [/v] Function( Arguments ) 
.call /s Prototype Function( Arguments ) 
.call /c 
.call /C 

Parameter

/V
Ausführliche Informationen zum Aufruf und seinen Argumenten werden angezeigt.

/sPrototyp
Ermöglicht das Aufrufen der von Function angegebenen Funktion, auch wenn Sie nicht über die richtigen Symbole verfügen. In diesem Fall benötigen Sie Symbole für eine andere Funktion, die über denselben aufrufenden Prototyp wie die Funktion verfügt, die Sie aufrufen möchten. Der Parameter Prototype ist der Name dieser Prototypfunktion.

Funktion
Gibt die aufgerufene Funktion an. Dies kann der Name der Funktion sein (vorzugsweise mit einem Modulnamen qualifiziert) oder ein anderer Ausdruck, der für die Funktionsadresse ausgewertet wird. Wenn Sie einen Konstruktor oder Destruktor aufrufen müssen, müssen Sie die Adresse angeben. Andernfalls verwenden Sie einen C++-Ausdruck, um die benannte Syntax für die Operatoren auszuwerten (weitere Informationen finden Sie unter Syntax für numerische Ausdrücke ).

Argumente
Gibt die Argumente an, die an die Funktion übergeben werden. Wenn Sie eine Methode aufrufen, muss das erste Argument dieses sein, und alle anderen Argumente folgen diesem. Argumente sollten durch Kommas getrennt werden und der üblichen Argumentsyntax entsprechen. Argumentlisten mit variabler Länge werden unterstützt. Ausdrücke in einem Argument werden vom C++-Ausdrucksauswerter analysiert. Weitere Informationen finden Sie unter C++-Nummern und -Operatoren . Sie können keine Literalzeichenfolge als Argument eingeben, aber Sie können einen Zeiger auf eine Zeichenfolge oder einen anderen Speicher verwenden, auf den der Zielprozess zugreifen kann.

/C
Löscht jeden vorhandenen Aufruf im aktuellen Thread.

/C
Löscht jeden vorhandenen Aufruf im aktuellen Thread und setzt den Kontext des aktuellen Threads auf den Kontext zurück, der vom ausstehenden Aufruf gespeichert ist.

Environment

Modi

Nur Benutzermodus

Ziele

Nur Livedebuggen

Plattformen

Nur x86 und x64

Hinweise

Die angegebene Funktion wird vom aktuellen Thread des aktuellen Prozesses aufgerufen.

Nur die Aufrufkonventionen cdecl, stdcall, fastcall und thiscall werden unterstützt. Verwalteter Code kann mit diesem Befehl nicht aufgerufen werden.

Nachdem .call verwendet wurde, aktualisiert der Debugger den Stapel, ändert den Anweisungszeiger so, dass er auf den Anfang der aufgerufenen Funktion zeigt, und beendet dann. Verwenden Sie g (Go), um die Ausführung fortzusetzen, oder ~. g , um nur den Thread auszuführen, der den Aufruf ausführt.

Wenn die Funktion zurückgibt, tritt ein Umbruch auf, und der Debugger zeigt den Rückgabewert der Funktion an. Der Rückgabewert wird auch im $callret Pseudoregister gespeichert, das den Typ des Rückgabewerts abruft.

Wenn Sie mit STRG+C oder STRG+BREAK in das Ziel eingebrochen haben, ist der aktuelle Thread ein zusätzlicher Thread, der zum Behandeln des Einbruchs erstellt wird. Wenn Sie an diesem Punkt einen .call-Befehl ausstellen, wird der zusätzliche Thread für die aufgerufene Funktion verwendet.

Wenn Sie einen vordefinierten Haltepunkt erreicht haben, gibt es keinen zusätzlichen Breakinthread. Wenn Sie .call an einem Haltepunkt im Benutzermodus verwenden, können Sie g verwenden, um den gesamten Prozess auszuführen, oder ~. g , um nur den aktuellen Thread auszuführen. Die Verwendung von g kann das Verhalten Ihres Programms verfälschen, da Sie einen Thread genommen und zu dieser neuen Funktion umgeleitet haben. Auf der anderen Seite hat dieser Thread weiterhin seine Sperren und andere Attribute, und daher ~ . g kann Deadlocks riskieren.

Die sicherste Möglichkeit, .call zu verwenden, besteht darin, einen Haltepunkt im Code an einer Stelle festzulegen, an der eine bestimmte Funktion sicher aufgerufen werden könnte. Wenn dieser Haltepunkt erreicht wird, können Sie .call verwenden, wenn Diese Funktion ausgeführt werden soll. Wenn Sie .call zu einem Punkt verwenden, an dem diese Funktion normalerweise nicht aufgerufen werden konnte, kann es zu einem Deadlock oder einer Zielbeschädigung kommen.

Es kann hilfreich sein, dem Quellcode zusätzliche Funktionen hinzuzufügen, die nicht vom vorhandenen Code aufgerufen werden, sondern vom Debugger aufgerufen werden sollen. Sie könnten beispielsweise Funktionen hinzufügen, die verwendet werden, um den aktuellen Zustand Ihres Codes und seiner Umgebung zu untersuchen und Informationen zum Zustand an einem bekannten Speicherspeicherort zu speichern. Achten Sie darauf, ihren Code nicht zu optimieren, da diese Funktionen möglicherweise vom Compiler entfernt werden. Verwenden Sie dieses Verfahren nur als letztes Mittel, denn wenn Ihre Anwendung abstürzt, ist der Aufruf beim Debuggen der Dumpdatei nicht verfügbar.

Die Befehle .call /c und .call /C sollten nur verwendet werden, wenn der Versuch, .call zu verwenden, fehlgeschlagen ist oder wenn Sie Ihre Meinung vor dem Eingeben des Befehls g geändert haben. Diese sollten nicht beiläufig verwendet werden, da das Abbrechen eines nicht abgeschlossenen Anrufs zu einem beschädigten Zielzustand führen kann.

Das folgende Codebeispiel zeigt, wie der Befehl .call /s verwendet wird.

.call /s KnownFunction UnknownFunction( 1 )

In diesem Beispiel verfügen Sie über private Symbole für KnownFunction, die eine ganze Zahl als einziges Argument akzeptiert und z. B. einen Zeiger auf ein Array zurückgibt. Sie haben keine Symbole oder möglicherweise nur öffentliche Symbole für UnknownFunction, aber Sie wissen, dass es eine ganze Zahl als einziges Argument akzeptiert und einen Zeiger auf ein Array zurückgibt. Mithilfe der Option /s können Sie angeben, dass UnknownFunction genauso funktioniert wie KnownFunction . So können Sie erfolgreich einen Aufruf von UnknownFunction generieren.