次の方法で共有


.call (関数の呼び出し)

.call コマンドを実行すると、ターゲット プロセスで関数が実行されます。

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

パラメーター

/v
呼び出しとその引数に関する詳細情報が表示されます。

/sプロトタイプ
正しいシンボルがない場合でも、Function で 指定されている関数 を呼び出すことができます。 この場合、呼び出そうとしている関数と同じ呼び出しプロトタイプを持つ別の関数のシンボルが必要です。 Prototype パラメーターは、このプロトタイプ関数の名前です。

関数
呼び出される関数を指定します。 これには、関数の名前 (モジュール名で修飾することが望ましい)、または関数アドレスに評価されるその他の式を指定できます。 コンストラクターまたはデストラクターを呼び出す必要がある場合は、アドレスを指定するか、C++ 式を使用して演算子の名前付き構文を評価する必要があります (詳細については、「数値式構文」を参照)。

引数
関数に渡される引数を指定します。 メソッドを呼び出す場合、最初の引数はこれである必要があり、他のすべての引数がそれに続きます。 引数はコンマで区切り、通常の引数構文と一致する必要があります。 可変長の引数リストがサポートされています。 引数内の式は、C++ 式エバリュエーターによって解析されます。詳細については、 C++ の数値と演算子 を参照してください。 リテラル文字列を引数として入力することはできませんが、文字列へのポインターまたはターゲット プロセスからアクセスできるその他のメモリを使用できます。

/c
現在のスレッドの既存の呼び出しをクリアします。

/C
現在のスレッドの既存の呼び出しをクリアし、現在のスレッドのコンテキストを未処理の呼び出しによって格納されているコンテキストにリセットします。

環境

モード

ユーザー モードのみ

Targets

ライブ デバッグのみ

プラットフォーム

x86 と x64 のみ。

解説

指定された関数は、現在のプロセスの現在のスレッドによって呼び出されます。

cdeclstdcallfastcall、および thiscall 呼び出し規則のみがサポートされています。 マネージド コードは、このコマンドでは呼び出すことができません。

.call が使用されると、デバッガーはスタックを更新し、呼び出された関数の先頭を指す命令ポインターを変更してから停止します。 実行を再開するには g (Go) を使用し、呼び出しを行うスレッドだけを実行するには ~. g を使用します。

関数が戻ると、中断が発生し、デバッガーは関数の戻り値を表示します。 戻り値は、戻り値の型を 取得する$callret 擬似レジスタにも格納されます。

Ctrl + C または Ctrl + BREAK を使用してターゲットに分割した場合、現在のスレッドは、ブレークインを処理するために作成された追加のスレッドです。 この時点で.call コマンドを 発行すると、呼び出 された関数に追加のスレッドが使用されます。

定義済みのブレークポイントに達した場合、余分なブレークイン スレッドはありません。 ユーザー モードのブレークポイントで .call を使用する場合は、g を使用してプロセス全体を実行し、~. g を使用して現在のスレッドだけを実行できます。 gを使用すると、1つのスレッドを取得してこの新しい関数に転送しているため、プログラムの動作が歪む可能性があります。 一方、このスレッドはロックやその他の属性を持ち続けるので ~.g はデッドロックを危険にさらす可能性があります。

.call を使用 する最も安全な方法は、特定の関数を安全に呼び出 すことができる場所に、コードにブレークポイントを設定することです。 そのブレークポイントにヒットすると、その関数を実行する必要がある場合は、.call を使用できます。 この関数を通常呼び出しできなかった時点で .call を使用すると、デッドロックまたはターゲットの破損が発生する可能性があります。

既存のコードによって呼び出されず、デバッガーによって呼び出されることを目的とした追加の関数をソース コードに追加すると便利な場合があります。 たとえば、コードとその環境の現在の状態を調査し、状態に関する情報を既知のメモリの場所に格納するために使用される関数を追加できます。 コードを最適化しないでください。または、これらの関数がコンパイラによって削除される可能性があります。 アプリケーションがクラッシュ した場合、ダンプ ファイルのデバッグ時に .call を使用できないため、この手法は最後の手段としてのみ使用してください。

.call /c コマンドと .call /C コマンドは、.call の使用が失敗した場合、またはgコマンドを入力する前に気が変わった場合にのみ使用する必要があります。 未完了の呼び出しを破棄するとターゲットの状態が破損する可能性があるため、これらは何気なく使用しないでください。

次のコード例は、 .call /s コマンドの使用方法を示しています。

.call /s KnownFunction UnknownFunction( 1 )

この例では、KnownFunction のプライベート シンボルがあります。このシンボルは、整数を唯一の引数として受け取り、配列へのポインターなどを返します。 シンボルがない場合や、UnknownFunctionのパブリック シンボルしかない場合もありますが、整数を唯一の引数として受け取り、配列へのポインターを返すことがわかります。 /s オプションを使用すると、UnknownFunction KnownFunction と同じように動作することを指定できます。 したがって、UnknownFunction の呼び出しを正常に生成できます。