Freigeben über


.call (Call Function)

Der AUFRUF-Befehl 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 den zugehörigen Argumenten werden angezeigt.

/s Prototyp
Ermöglicht es Ihnen, die Funktion aufzurufen, die von Function angegeben wird, auch wenn Sie nicht über die richtigen Symbole verfügen. In diesem Fall müssen Sie Symbole für eine andere Funktion haben, die denselben aufrufenden Prototyp wie die Funktion aufweist, die Sie aufrufen möchten. Der Parameter "Prototyp" ist der Name dieser Prototypfunktion.

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

Argumente
Gibt die Argumente an, die an die Funktion übergeben werden. Wenn Sie eine Methode aufrufen, muss das erste Argument dies sein, und alle anderen Argumente folgen dem Argument. Argumente sollten durch Kommas getrennt und mit der üblichen Argumentsyntax übereinstimmen. Argumentlisten mit variabler Länge werden unterstützt. Ausdrücke innerhalb eines Arguments werden vom Evaluator des C++-Ausdrucks 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 alle vorhandenen Aufrufe im aktuellen Thread.

/C
Löscht alle vorhandenen Aufrufe für den aktuellen Thread und setzt den Kontext des aktuellen Threads auf den vom ausstehenden Aufruf gespeicherten Kontext zurück.

Environment

Modi

Nur Benutzermodus

Targets

Nur Livedebugging

Plattformen

nur x86 und x64

Hinweise

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

Nur cdecl, stdcall, fastcall und thiscall calling conventions werden unterstützt. Verwalteter Code kann von diesem Befehl nicht aufgerufen werden.

Nachdem der AUFRUF verwendet wurde, aktualisiert der Debugger den Stapel, ändert den Anweisungspunkt so, dass er auf den Anfang der aufgerufenen Funktion zeigt, und beenden Sie 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ückgegeben wird, 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 unterteilt sind, ist der aktuelle Thread ein zusätzlicher Thread, der zum Behandeln des Umbruchs erstellt wurde. Wenn Sie an diesem Punkt einen AUFRUFbefehl ausgeben, wird der zusätzliche Thread für die aufgerufene Funktion verwendet.

Wenn Sie einen vordefinierten Haltepunkt erreicht haben, gibt es keinen zusätzlichen Unterbrechungsthread. Wenn Sie ".call" während eines Haltepunkts 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. Andererseits wird dieser Thread weiterhin über seine Sperren und andere Attribute verfügen, und somit ~. g kann Deadlocks riskieren.

Die sicherste Möglichkeit zum Verwenden von .call besteht darin, einen Haltepunkt in Ihrem Code an einem Ort festzulegen, an dem eine bestimmte Funktion sicher aufgerufen werden kann. Wenn dieser Haltepunkt erreicht ist, können Sie .call verwenden, wenn Sie möchten, dass diese Funktion ausgeführt werden soll. Wenn Sie ".call" an einem Punkt verwenden, an dem diese Funktion normalerweise nicht aufgerufen werden konnte, kann eine Deadlock- oder Zielbeschädigung dazu führen.

Es kann hilfreich sein, dem Quellcode zusätzliche Funktionen hinzuzufügen, die nicht vom vorhandenen Code aufgerufen werden, aber vom Debugger aufgerufen werden sollen. Sie können z. B. Funktionen hinzufügen, die zum Untersuchen des aktuellen Zustands Ihres Codes und ihrer Umgebung verwendet werden, und Informationen zum Zustand an einem bekannten Speicherort speichern. Achten Sie darauf, den Code nicht zu optimieren, oder diese Funktionen werden möglicherweise vom Compiler entfernt. Verwenden Sie diese Technik nur als letztes Mittel, da beim Debuggen der Speicherabbilddatei beim Debuggen der Speicherabbilddatei kein Aufruf verfügbar ist, wenn ihre Anwendung abstürzt.

Die .call /c- und .call /C-Befehle sollten nur verwendet werden, wenn ein Versuch, .call zu verwenden, fehlgeschlagen ist, oder wenn Sie Ihre Meinung geändert haben, bevor Sie den g-Befehl eingeben. Diese sollten nicht zufällig verwendet werden, da das Verlassen eines nicht abgeschlossenen Anrufs zu einem beschädigten Zielstatus führen kann.

Das folgende Codebeispiel zeigt, wie der BEFEHL "/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 beispielsweise 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 auf die gleiche Weise funktioniert wie KnownFunction. Daher können Sie erfolgreich einen Aufruf von UnknownFunction generieren.