共用方式為


.call (Call 函式)

.call命令會使目標進程執行函式。

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

參數

/V
隨即顯示有關呼叫及其引數的詳細資訊。

/s原型
可讓您呼叫 由 Function 指定的函式,即使您沒有正確的符號也一樣。 在此情況下,您必須有另一個函式的符號,該函式具有與您嘗試呼叫之函式相同的呼叫原型。 原型參數是這個原型函式的名稱。

功能
指定要呼叫的函式。 這可以是函式的名稱 (最好是模組名稱) 限定,或是評估為函式位址的任何其他運算式。 如果您需要呼叫建構函式或解構函式,您必須提供位址 -- 否則請使用 C++ 運算式來評估運算子的具名語法, (如需詳細資料,請參閱 數值運算式語法) 。

參數
指定傳遞至函式的引數。 如果您要呼叫方法,則第一個引數必須是 這個,所有其他引數都會跟著它。 引數應該以逗號分隔,而且應該符合一般的引數語法。 支援可變長度引數清單。 引數內的運算式是由 C++ 運算式評估工具剖析;如需詳細資訊,請參閱 C++ 數位和運算子 。 您無法輸入常值字串做為引數,但您可以使用字串的指標,或是目標進程可存取的任何其他記憶體。

/C
清除目前線程上的任何現有呼叫。

/C
清除目前線程上任何現有的呼叫,並將目前線程的內容重設為未完成呼叫所儲存的內容。

環境

模式

僅限使用者模式

目標

僅限即時偵錯

平台

僅限 x86 和 x64

備註

指定的函式是由目前進程的目前線程所呼叫。

僅支援 cdeclstdcallfastcallthiscall 呼叫慣例。 此命令無法呼叫 Managed 程式碼。

使用 .call 之後,偵錯工具會更新堆疊、將指令指標變更為指向所呼叫函式的開頭,然後停止。 使用 g (Go) 繼續執行,或 ~.g 只執行發出呼叫的執行緒。

當函式傳回時,就會發生中斷,而偵錯工具會顯示函式的傳回值。 傳回值也會儲存在 $callret 虛擬暫存器中,以取得傳回值的型別。

如果您已使用 CTRL+C 或 CTRL+BREAK 中斷目標,則目前線程是建立以處理中斷的額外線程。 如果您此時發出 .call 命令,則會將額外的執行緒用於呼叫的函式。

如果您已達到預先定義的中斷點,則沒有任何額外的中斷線程。 如果您在使用者模式的中斷點上使用 .call ,則可以使用 g 來執行整個進程,或 ~.g 只執行目前的執行緒。 使用 g 可能會扭曲程式的行為,因為您已採用一個執行緒,並將它改成這個新的函式。 另一方面,這個執行緒仍然會有其鎖定和其他屬性,因此 ~.g 可能會有死結的風險。

使用 .call 的最安全方式是在程式碼中設定可安全地呼叫特定函式的位置中斷點。 叫用該中斷點時,如果您想要執行該函式,可以使用 .call 。 如果您在通常無法呼叫此函式的某個時間點使用 .call ,可能會導致死結或目標損毀。

將額外的函式新增至您的原始程式碼可能很有用,這些函式不是由現有程式碼所呼叫,而是要由偵錯工具呼叫。 例如,您可以新增用來調查程式碼及其環境的目前狀態的函式,並將狀態的相關資訊儲存在已知的記憶體位置。 請務必不要優化您的程式碼,否則編譯器可能會移除這些函式。 只使用這項技術做為最後一個方法,因為如果您的應用程式在偵錯傾印檔案時,將無法使用 .call

只有在嘗試使用.call失敗,或輸入g命令之前變更心意,才應該使用.call.call /C命令。 這些不應該隨意使用,因為放棄未完成的呼叫可能會導致損毀的目標狀態。

下列程式碼範例示範如何使用 .call /s 命令。

.call /s KnownFunction UnknownFunction( 1 )

在此範例中,您有 KnownFunction的私人符號,它會採用整數作為唯一的引數,並傳回陣列的指標。 您沒有符號,或可能只有 UnknownFunction的公用符號,但您知道它會採用整數作為唯一引數,並傳回陣列的指標。 藉由使用/s選項,您可以指定UnknownFunction 的運作方式與 KnownFunction相同。 因此,您可以成功產生 UnknownFunction的呼叫。