Condividi tramite


.call (funzione di chiamata)

Il comando .call causa l'esecuzione di una funzione da parte del processo di destinazione.

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

Parametri

/Presso
Vengono visualizzate informazioni dettagliate sulla chiamata e sui relativi argomenti.

/sPrototipo
Consente di chiamare la funzione specificata da Function anche se non si dispone dei simboli corretti. In questo caso, è necessario disporre di simboli per un'altra funzione con lo stesso prototipo chiamante della funzione che si sta tentando di chiamare. Il parametro Prototype è il nome di questa funzione prototipo.

Funzione
Specifica la funzione chiamata. Può trattarsi del nome della funzione (preferibilmente qualificato con un nome di modulo) o qualsiasi altra espressione che restituisce l'indirizzo della funzione. Se è necessario chiamare un costruttore o un distruttore, è necessario specificare l'indirizzo oppure usare un'espressione C++ per valutare la sintassi denominata per gli operatori . Per informazioni dettagliate, vedere sintassi delle espressioni numeriche .

Argomenti
Specifica gli argomenti passati alla funzione. Se si chiama un metodo, il primo argomento deve essere questo e tutti gli altri argomenti lo seguono. Gli argomenti devono essere separati da virgole e devono corrispondere alla sintassi degli argomenti consueti. Sono supportati elenchi di argomenti a lunghezza variabile. Le espressioni all'interno di un argomento vengono analizzate dall'analizzatore di espressioni C++; per informazioni dettagliate, vedere Numeri e operatori C++ . Non è possibile immettere una stringa letterale come argomento, ma è possibile usare un puntatore a una stringa o qualsiasi altra memoria accessibile al processo di destinazione.

/C
Cancella qualsiasi chiamata esistente nel thread corrente.

/C
Cancella qualsiasi chiamata esistente al thread corrente e reimposta il contesto del thread corrente sul contesto archiviato dalla chiamata in sospeso.

Ambiente

Modalità

solo modalità utente

Server di destinazione

solo debug in tempo reale

Piattaforme

Solo x86 e x64

Commenti

La funzione specificata viene chiamata dal thread corrente del processo corrente.

Sono supportate solo le convenzioni di chiamata cdecl, stdcall, fastcall e thiscall . Il codice gestito non può essere chiamato da questo comando.

Dopo l'uso di .call , il debugger aggiornerà lo stack, modifica il puntatore all'istruzione in modo che punti all'inizio della funzione chiamata e quindi arresta. Usare g (Go) per riprendere l'esecuzione oppure ~. g per eseguire solo il thread che effettua la chiamata.

Quando la funzione viene restituita, si verifica un'interruzione e il debugger visualizza il valore restituito della funzione. Il valore restituito viene archiviato anche nel $callret pseudoregistro, che acquisisce il tipo del valore restituito.

Se la destinazione è stata suddivisa usando CTRL+C o CTRL+INTERR, il thread corrente è un thread aggiuntivo creato per gestire l'interruzione. Se si esegue un comando .call a questo punto, verrà usato il thread aggiuntivo per la funzione chiamata.

Se è stato raggiunto un punto di interruzione predefinito, non è presente alcun thread di interruzione aggiuntivo. Se si usa .call in corrispondenza di un punto di interruzione in modalità utente, è possibile usare g per eseguire l'intero processo oppure ~. g per eseguire solo il thread corrente. L'uso di g può distorcere il comportamento del programma, poiché è stato preso un thread e lo si è deviato a questa nuova funzione. D'altra parte, questo thread avrà ancora i blocchi e altri attributi, e quindi ~. g può rischire deadlock.

Il modo più sicuro per usare .call consiste nell'impostare un punto di interruzione nel codice in una posizione in cui una determinata funzione potrebbe essere chiamata in modo sicuro. Quando viene raggiunto tale punto di interruzione, è possibile usare .call se si desidera che tale funzione venga eseguita. Se si usa .call in un punto in cui questa funzione non è in genere stata chiamata, potrebbe verificarsi un deadlock o un danneggiamento della destinazione.

Può essere utile aggiungere funzioni aggiuntive al codice sorgente che non vengono chiamate dal codice esistente, ma che devono essere chiamate dal debugger. Ad esempio, è possibile aggiungere funzioni usate per analizzare lo stato corrente del codice e il relativo ambiente e archiviare informazioni sullo stato in una posizione di memoria nota. Assicurarsi di non ottimizzare il codice o che queste funzioni vengano rimosse dal compilatore. Usare questa tecnica solo come ultima risorsa, perché se l'applicazione arresta in modo anomalo la chiamata non sarà disponibile durante il debug del file di dump.

I comandi .call /c e .call /C devono essere usati solo se un tentativo di usare .call non è riuscito o se è stata modificata la mente prima di immettere il comando g . Questi non devono essere usati casualmente, poiché l'abbandono di una chiamata non compilata può causare uno stato di destinazione danneggiato.

Nell'esempio di codice seguente viene illustrato come viene usato il comando .call /s .

.call /s KnownFunction UnknownFunction( 1 )

In questo esempio sono disponibili simboli privati per KnownFunction, che accetta un intero come unico argomento e restituisce, ad esempio, un puntatore a una matrice. Non si dispone di simboli o di simboli pubblici solo per UnknownFunction, ma si sa che accetta un intero come unico argomento e restituisce un puntatore a una matrice. Usando l'opzione /s , è possibile specificare che UnknownFunction funzionerà allo stesso modo di KnownFunction . È quindi possibile generare correttamente una chiamata a UnknownFunction.