共用方式為


繫結中斷點

如果使用者設定中斷點,或許是透過按 F9,IDE 會制定要求,並提示偵錯工作階段建立中斷點。

設定中斷點

設定中斷點是個兩步驟的程序,因為受中斷點影響的程式碼或資料可能尚無法使用。 首先,必須描述中斷點,然後,當程式碼或資料可以使用時,它必須繫結至該程式碼或資料,如下所示:

  1. 從相關的偵錯引擎 (DES) 要求中斷點,然後中斷點在程式碼或資料可供使用時繫結至該程式碼或資料。

  2. 中斷點要求會傳送至偵錯工作階段,以將它傳送至所有相關的 DES。 任何選擇處理中斷點的 DE 都會建立相對應的暫止中斷點。

  3. 偵錯工作階段收集暫止中斷點,並將其傳回偵錯套件 (Visual Studio 的偵錯元件)。

  4. 偵錯套件提示偵錯工作階段將暫止中斷點繫結至程式碼或資料。 偵錯工作階段將此要求傳送至所有相關 DES。

  5. 如果 DE 能夠繫結中斷點,它會將中斷點繫結事件傳回偵錯工作階段。 如果不能,它會改傳送中斷點錯誤事件。

暫止中斷點

暫止中斷點可以繫結至多個程式碼位置。 例如,C++ 範本的原始碼行可以繫結至從範本產生的每個程式碼序列。 偵錯工作階段可以使用中斷點繫結事件來列舉在傳送事件時繫結至中斷點的程式碼內容。 稍後可以繫結更多程式碼內容,因此 DE 可針對每個繫結要求傳送多個中斷點繫結事件。 不過,DE 應該對每個繫結要求只傳送一個中斷點錯誤事件。

實作

偵錯套件會以程式設計方式呼叫工作階段偵錯管理員 (SDM),並為其提供 IDebugBreakpointRequest2 介面,以包裝 BP_REQUEST_INFO 結構,當中描述要設定的中斷點。 雖然中斷點可以有許多形式,但它們最終都會解析為程式碼或資料內容。

SDM 會藉由呼叫其 CreatePendingBreakpoint 方法,將此呼叫傳遞給每個相關的 DE。 如果 DE 選擇處理中斷點,它會建立並傳回 IDebugPendingBreakpoint2 介面。 SDM 會收集這些介面,並將它們傳回偵錯套件做為單一 IDebugPendingBreakpoint2 介面。

到目前為止,尚未產生任何事件。

偵錯套件接著會呼叫 DE 所實作的 Bind,嘗試將暫止中斷點繫結至程式碼或資料。

如果中斷點已繫結,DE 會將 IDebugBreakpointBoundEvent2 事件介面傳送至偵錯套件。 偵錯套件會使用此介面,藉由呼叫 EnumBoundBreakpoints 來列舉繫結至中斷點的所有程式碼內容 (或單一資料內容),這會傳回一或多個 IDebugBoundBreakpoint2 介面。 GetBreakpointResolution 介面會傳回 IDebugBreakpointResolution2 介面,而 GetResolutionInfo 會傳回包含程式碼或資料內容的 BP_RESOLUTION_INFO 聯集。

如果 DE 無法繫結中斷點,它會將單一 IDebugBreakpointErrorEvent2 事件介面傳送至偵錯套件。 偵錯套件會藉由呼叫 GetErrorBreakpoint,後面接著 GetBreakpointResolutionGetResolutionInfo 來擷取錯誤類型 (錯誤或警告) 和參考訊息。 這會傳回包含錯誤類型和訊息的 BP_ERROR_RESOLUTION_INFO 結構。

如果 DE 處理中斷點但無法繫結它,則會傳回 BPET_TYPE_ERROR 類型的錯誤。 偵錯套件會藉由顯示錯誤對話方塊來回應,而 IDE 會在原始程式碼行左邊的中斷點字符內放置驚嘆號字符。

如果 DE 處理中斷點,無法繫結它,但有些其他 DE 可能繫結它,則會傳回警告。 IDE 會藉由將問題字符放在原始程式碼行左邊的中斷點字符內來回應。