Partager via


.call (fonction d’appel)

La commande .call entraîne l’exécution d’une fonction par le processus cible.

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

Paramètres

/v
Des informations détaillées sur l’appel et ses arguments sont affichées.

/s Prototype
Vous permet d’appeler la fonction spécifiée par la fonction même si vous n’avez pas les symboles corrects. Dans ce cas, vous devez avoir des symboles pour une autre fonction qui a le même prototype appelant que la fonction que vous essayez d’appeler. Le paramètre Prototype est le nom de cette fonction prototype.

Fonction
Spécifie la fonction appelée. Il peut s’agir du nom de la fonction (de préférence qualifié avec un nom de module) ou d’une autre expression qui prend la valeur de l’adresse de la fonction. Si vous devez appeler un constructeur ou un destructeur, vous devez fournir l’adresse , ou bien utiliser une expression C++ pour évaluer la syntaxe nommée des opérateurs (voir Syntaxe d’expression numérique pour plus d’informations).

Arguments
Spécifie les arguments passés à la fonction. Si vous appelez une méthode, le premier argument doit être ceci, et tous les autres arguments le suivent. Les arguments doivent être séparés par des virgules et doivent correspondre à la syntaxe d’argument habituelle. Les listes d’arguments de longueur variable sont prises en charge. Les expressions d’un argument sont analysées par l’évaluateur d’expression C++ ; pour plus d’informations, consultez Les numéros et opérateurs C++. Vous ne pouvez pas entrer une chaîne littérale en tant qu’argument, mais vous pouvez utiliser un pointeur vers une chaîne ou toute autre mémoire accessible au processus cible.

/c
Efface tout appel existant sur le thread actuel.

/C
Efface tout appel existant sur le thread actuel et réinitialise le contexte du thread actuel au contexte stocké par l’appel en attente.

Environnement

Les modes

mode utilisateur uniquement

Targets

uniquement en débogage

Platforms

x86 et x64 uniquement

Notes

La fonction spécifiée est appelée par le thread actuel du processus actuel.

Seuls les conventions d’appel cdecl, stdcall, fastcall et thiscall sont prises en charge. Le code managé ne peut pas être appelé par cette commande.

Une fois que .call est utilisé, le débogueur met à jour la pile, modifiez le pointeur d’instruction pour qu’il pointe vers le début de la fonction appelée, puis arrêtez. Utilisez g (Go) pour reprendre l’exécution, ou ~. g pour exécuter uniquement le thread effectuant l’appel.

Lorsque la fonction est retournée, un saut se produit et le débogueur affiche la valeur de retour de la fonction. La valeur de retour est également stockée dans le $callret pseudo-registre, qui acquiert le type de la valeur de retour.

Si vous avez rompu à la cible à l’aide de Ctrl+C ou CTRL+BREAK, le thread actuel est un thread supplémentaire créé pour gérer l’arrêt. Si vous émettez une commande .call à ce stade, le thread supplémentaire sera utilisé pour la fonction appelée.

Si vous avez atteint un point d’arrêt prédéfini, il n’existe aucun thread d’arrêt supplémentaire. Si vous utilisez .call lors d’un point d’arrêt en mode utilisateur, vous pouvez utiliser g pour exécuter l’intégralité du processus, ou ~. g pour exécuter uniquement le thread actuel. L’utilisation de g peut fausser le comportement de votre programme, car vous avez pris un thread et l’a redirigé vers cette nouvelle fonction. En revanche, ce thread aura toujours ses verrous et d’autres attributs, et donc ~. g peut risquer des interblocages.

Le moyen le plus sûr d’utiliser .call consiste à définir un point d’arrêt dans votre code à un emplacement où une certaine fonction peut être appelée en toute sécurité. Lorsque ce point d’arrêt est atteint, vous pouvez utiliser .call si vous souhaitez que cette fonction s’exécute. Si vous utilisez .call à un moment où cette fonction n’a pas pu normalement être appelée, un blocage ou une altération de la cible peut entraîner une altération.

Il peut être utile d’ajouter des fonctions supplémentaires à votre code source qui ne sont pas appelées par le code existant, mais qui sont destinées à être appelées par le débogueur. Par exemple, vous pouvez ajouter des fonctions utilisées pour examiner l’état actuel de votre code et son environnement et stocker des informations sur l’état dans un emplacement de mémoire connu. Veillez à ne pas optimiser votre code, ou ces fonctions peuvent être supprimées par le compilateur. Utilisez cette technique uniquement comme dernier recours, car si votre application plante .call ne sera pas disponible lors du débogage du fichier de vidage.

Les commandes .call /c et .call /C ne doivent être utilisées que si une tentative d’utilisation de .call a échoué, ou si vous avez changé d’avis avant d’entrer la commande g . Celles-ci ne doivent pas être utilisées occasionnellement, car l’abandon d’un appel non supprimé peut entraîner un état cible endommagé.

L’exemple de code suivant montre comment la commande .call /s est utilisée.

.call /s KnownFunction UnknownFunction( 1 )

Dans cet exemple, vous avez des symboles privés pour KnownFunction, qui accepte un entier comme seul argument et retourne, par exemple, un pointeur vers un tableau. Vous n’avez pas de symboles, ou éventuellement vous avez uniquement des symboles publics pour UnknownFunction, mais vous savez qu’il prend un entier comme seul argument et retourne un pointeur vers un tableau. En utilisant l’option /s , vous pouvez spécifier que UnknownFunction fonctionnera de la même façon que KnownFunction . Ainsi, vous pouvez générer un appel à UnknownFunction.