Compartir a través de


.call (Función Call)

El comando .call hace que el proceso de destino ejecute una función.

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

Parámetros

/v
Se muestra información detallada sobre la llamada y sus argumentos.

/s Prototipo
Permite llamar a la función especificada por Function aunque no tenga los símbolos correctos. En este caso, debe tener símbolos para otra función que tenga el mismo prototipo de llamada que la función a la que intenta llamar. El parámetro Prototype es el nombre de esta función de prototipo.

Función
Especifica la función a la que se llama. Puede ser el nombre de la función (preferiblemente calificado con un nombre de módulo) o cualquier otra expresión que se evalúe como dirección de función. Si necesita llamar a un constructor o destructor, debe proporcionar la dirección ; o bien usar una expresión de C++ para evaluar la sintaxis con nombre de los operadores (vea Sintaxis de expresión numérica para obtener más información).

Argumentos
Especifica los argumentos pasados a la función. Si llama a un método, el primer argumento debe ser éste y todos los demás argumentos lo siguen. Los argumentos se deben separar con comas y deben coincidir con la sintaxis de argumento habitual. Se admiten listas de argumentos de longitud variable. El evaluador de expresiones de C++ analiza las expresiones dentro de un argumento; consulte Números y operadores de C++ para obtener más información. No puede escribir una cadena literal como argumento, pero puede usar un puntero a una cadena o cualquier otra memoria accesible para el proceso de destino.

/c
Borra cualquier llamada existente en el subproceso actual.

/C
Borra cualquier llamada existente en el subproceso actual y restablece el contexto del subproceso actual al contexto almacenado por la llamada pendiente.

Entorno

Modos

solo modo de usuario

Destinos

solo depuración en vivo

Platforms

Solo x86 y x64

Comentarios

El subproceso actual del proceso actual llama a la función especificada.

Solo se admiten las convenciones de llamada cdecl, stdcall, fastcall y thiscall. Este comando no puede llamar al código administrado.

Después de usar .call , el depurador actualizará la pila, cambiará el puntero de instrucción para que apunte al principio de la función llamada y, a continuación, se detendrá. Use g (Go) para reanudar la ejecución o ~. g para ejecutar solo el subproceso que realiza la llamada.

Cuando se devuelve la función, se produce una interrupción y el depurador muestra el valor devuelto de la función. El valor devuelto también se almacena en el $callret pseudo-register, que adquiere el tipo del valor devuelto.

Si ha dividido en el destino mediante CTRL+C o CTRL+BREAK, el subproceso actual es un subproceso adicional creado para controlar la interrupción. Si emite un comando .call en este punto, se usará el subproceso adicional para la función llamada.

Si ha alcanzado un punto de interrupción predefinido, no hay ningún subproceso de interrupción adicional. Si usa .call mientras se encuentra en un punto de interrupción en modo de usuario, puede usar g para ejecutar todo el proceso o ~. g para ejecutar solo el subproceso actual. El uso de g puede distorsionar el comportamiento del programa, ya que ha tomado un subproceso y lo ha desviado a esta nueva función. Por otro lado, este subproceso seguirá teniendo sus bloqueos y otros atributos y, por tanto , ~. g puede arriesgar interbloqueos.

La manera más segura de usar .call es establecer un punto de interrupción en el código en una ubicación donde se podría llamar a una determinada función de forma segura. Cuando se alcanza ese punto de interrupción, puede usar .call si desea que se ejecute esa función. Si usa .call en un punto en el que no se pudo llamar normalmente a esta función, podría producirse un interbloqueo o daños de destino.

Puede ser útil agregar funciones adicionales al código fuente que no llama el código existente, pero que el depurador debe llamar a ellas. Por ejemplo, podría agregar funciones que se usan para investigar el estado actual del código y su entorno y almacenar información sobre el estado en una ubicación de memoria conocida. Asegúrese de no optimizar el código o el compilador puede quitar estas funciones. Use esta técnica solo como último recurso, ya que si la aplicación bloquea .call no estará disponible al depurar el archivo de volcado.

Los comandos .call /c y .call /C solo deben usarse si se ha producido un error en un intento de usar .call o si cambió de opinión antes de escribir el comando g . No se deben usar casualmente, ya que abandonar una llamada no completa puede provocar un estado de destino dañado.

En el ejemplo de código siguiente se muestra cómo se usa el comando .call /s .

.call /s KnownFunction UnknownFunction( 1 )

En este ejemplo, tiene símbolos privados para KnownFunction, que toma un entero como único argumento y devuelve, por ejemplo, un puntero a una matriz. No tiene símbolos o, posiblemente, solo tiene símbolos públicos para UnknownFunction, pero sabe que toma un entero como único argumento y devuelve un puntero a una matriz. Mediante el uso de la opción /s , puede especificar que UnknownFunction funcionará de la misma manera que lo hace KnownFunction . Por lo tanto, puede generar correctamente una llamada a UnknownFunction.