調試程式引擎可以同時偵錯多個目標。 偵錯會話 在引擎取得目標時開始,並繼續進行,直到捨棄所有目標為止。 當目標正在執行時,偵錯會話是無法存取的;而當目前的目標暫停時,偵錯會話是可存取的。 引擎只能在會話可存取時,用來檢查及操作目標。
調試程式的主要迴圈通常包含設定執行狀態、呼叫 WaitForEvent 方法及處理產生的 事件。 呼叫 WaitForEvent 時,會話會變成無法存取。
當目標中發生事件時,引擎會暫停所有目標,而會話會變成可存取。 然後引擎會通知與該事件相關的回呼,並遵循事件篩選規則。 事件回呼和事件篩選會決定目標中的執行應該如何繼續。 如果他們判斷引擎應該闖入調試程式, WaitForEvent 方法會傳回 ,而會話仍可存取;否則,引擎會以事件回呼和事件篩選條件所決定的方式繼續執行目標,而且會話會再次變成無法存取。
在 WaitForEvent 呼叫期間,特別是通知事件回呼並處理篩選規則時,引擎處於稱為「在等候中」的狀態。 處於此狀態時,無法呼叫 WaitForEvent (它不是重新進入)。
在目標中起始執行有兩個步驟:設定執行狀態,然後呼叫 WaitForEvent。 您可以使用 SetExecutionStatus 方法設定執行狀態,或執行設定執行狀態的調試程式命令,例如 g(Go) 和 p (Step) 來設定執行狀態。
如果一系列的除錯程式命令被一起執行,例如「g ; ? @$ip」,那麼在需要於目標中執行的命令後面(如果該命令不是序列中的最後一個命令),將會發生 隱含等候。 調試程式引擎處於「等待狀態」時,無法進行隱式等待;在此情況下,命令的執行會停止,而當前命令,即試圖引發隱式等待的命令,會被解讀為表示目標中的執行應如何繼續。 其餘的命令將會捨棄。
注意 判斷會話是否可供訪問或無法訪問時,有限的目標執行(例如逐步執行)被視為引擎的執行。 當受限的執行完成時,會話就會變得可以存取。
主機引擎
從遠端偵錯時,您可以使用偵錯引擎的多個實體。 只有其中一個實例會維護偵錯會話;這個實例稱為 主機引擎。
所有調試程式作業都與主機引擎相對,例如符號載入和延伸模組載入。