共用方式為


.call (呼叫函式)

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

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

參數

/v
呼叫及其自變數的詳細信息隨即顯示。

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

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

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

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

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

Environment

模式

僅限使用者模式

目標

僅限即時偵錯

平台

僅限 x86 和 x64

備註

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

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

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

當函式傳回時,就會發生中斷,而調試程式會顯示函式的傳回值。 傳回值也會儲存在$callret虛擬緩存器中,以取得傳回值的型別。

如果您已使用 CTRL+C 或 CTRL+BREAK 進入目標,則目前的線程是建立其他線程來處理 breakin。 如果您此時發出 .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 的呼叫。