共用方式為


結合此方法與遠端偵錯

有時候,從核心調試程式控制使用者模式調試程式,並同時使用使用者模式調試程式做為偵錯伺服器會很有用。

例如,當您的使用者模式符號位於符號伺服器上時,此設定很有用。 在從核心調試程式控制使用者模式調試程式的標準組態中,這兩個調試程式的互動可能會導致同步處理時發生微小的失誤,而且這些失誤可以防止符號伺服器驗證。 這裡所述的更複雜的組態可以避免這個問題。

注意 在描述此案例時,目標應用程式是指正在偵錯的使用者模式應用程式,目標計算機是指包含目標應用程式和CDB或NTSD進程的電腦,而主計算機則是指包含核心調試程式的計算機。

若要使用這項技術,您必須執行下列動作:

  1. 使用 -ddefer 和 -server 命令行選項,在目標計算機上啟動 NTSD 或 CDB,並指定所需的傳輸選項。 -server 選項必須是命令行上的第一個參數。

    例如,您可以使用下列語法附加至執行中的進程。

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] -p PID 
    

    或者,您可以使用下列語法來啟動新的進程作為目標。

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] ApplicationName 
    

    如果您要將此安裝為驗屍調試程式,您可以使用下列語法。 請注意,您必須手動編輯登錄,以安裝包含 -server 參數的驗屍調試程式;如需詳細資訊,請參閱 啟用事後偵錯

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] 
    

    如需可用傳輸選項的相關信息,請參閱 啟用偵錯伺服器

  2. 在主計算機上啟動 WinDbg 或 KD,就像您要偵錯目標電腦一樣,但實際上不會中斷目標計算機。 若要使用 WinDbg,請使用下列語法。

    windbg [-y KernelSymbolPath] [-k ConnectionOptions] 
    

    如需此步驟的詳細資訊,請參閱 使用 WinDbg 進行即時內核模式偵錯 (傳統)

    .

  3. 以偵錯用戶端的形式啟動 WinDbg 或 CDB,其傳輸選項與用來啟動伺服器的傳輸選項相同。 此偵錯用戶端可以在主電腦或第三部計算機上執行。

    cdb -remote ClientTransport 
    

    如需此步驟的詳細資訊,請參閱 啟用偵錯用戶端

  4. 調試程式執行且 Input> 提示出現在核心調試程式中之後,請使用 .sleep (暫停調試程式) 命令來暫停調試程式,並讓目標計算機執行幾秒鐘。 這可讓目標電腦有時間處理遠端傳輸通訊協定,並建立使用者模式遠端伺服器與遠端用戶端之間的連線。

如果您使用CDB做為使用者模式調試程式,與CDB相關聯的 [命令提示字元] 視窗會在偵錯繼續時保持鎖定且無法使用。 如果您使用 NTSD,即使 NTSD 在目標電腦上有與其相關聯的進程識別碼,也不會建立其他視窗。

切換模式主題中所述的四種模式和切換方法會套用在此組合案例中,但有下列差異:

  • 有兩種不同的使用者模式偵錯模式。 當目標電腦執行時,偵錯伺服器是由偵錯用戶端所控制,如同任何其他遠端偵錯會話;這稱為 遠端控制的使用者模式偵錯。 當內核模式調試程式中斷至目標計算機且 Input> 提示顯示時,使用者模式調試程式會由核心調試程式控制;這稱為 內核控制的使用者模式偵錯

  • 這兩種模式永遠無法同時使用。 當核心調試程式中斷至目標計算機時,即使使用者模式調試程式可能處於作用中狀態,目標計算機仍無法處理遠端傳輸通訊協定,因此使用者模式調試程式將無法透過此連線接收遠端輸入。

  • 如果您的使用者模式符號位於符號伺服器上,則在遠端控制的使用者模式偵錯模式中,應該發出任何需要符號存取的調試程式命令。

  • 若要從核心控制的使用者模式偵錯切換到遠端控制的使用者模式偵錯,請使用 .sleep (暫停調試程式) 命令。 當使用者模式調試程式從睡眠命令喚醒時,它會處於遠端控制的使用者模式偵錯模式。

  • 若要從遠端控制的使用者模式偵錯切換到內核模式偵錯,請從 Input> 提示字元輸入任何命令。 如果看不到此提示,請切換至內核模式偵錯,然後在提示字元中使用 g (Go) 命令kd>

在內部,以 -ddefer 開頭的使用者模式調試程式會優先提供偵錯客戶端的輸入,以及從核心調試程序輸入的第二個優先順序。 不過,無法同時輸入之間發生衝突,因為當核心調試程式已中斷至目標計算機時,遠端連線就無法使用。