使用CDB對使用者模式進程進行偵錯

您可以使用CDB附加至執行中的進程,或繁衍並附加至新進程。

附加至執行中的進程

命令提示符

在命令提示字元視窗中,您可以在啟動 CDB 時附加至執行中的進程。 使用下列其中一個指令:

  • cdb -p ProcessID
  • cdb -pn ProcessName

其中 ProcessID 是執行中進程的進程標識碼,而 ProcessName 是執行中進程的名稱。

如需命令行語法的詳細資訊,請參閱CDB命令行選項

CDB 命令視窗

如果調試程式已經偵錯一或多個進程,您可以使用 .attach (附加至進程) 命令附加至執行中的進程

除非部分線程已凍結或暫停,否則調試程式一律會同時啟動多個目標進程。

如果 .attach 命令成功,調試程式會在下次調試程式發出執行命令時附加至指定的進程。 如果您在一個數據列中使用此命令數次,則調試程式必須要求執行多次,才能使用此命令。

非侵入性地附加至執行中的進程

如果您想要對執行中的進程進行偵錯,而且只干擾其執行中,您應該不具侵入性地對進程進行偵錯。

命令提示符

若要從CDB命令行對執行中的進程進行非侵入性偵錯,請在下列語法中指定 -pv 選項、 -p 選項和進程標識元。

cdb -pv -p ProcessID

或者,若要指定進程名稱,以非侵入性地偵錯執行中的進程,請改用下列語法。

cdb -pv -pn ProcessName

還有數個其他實用的命令行選項。 如需命令行語法的詳細資訊,請參閱CDB命令行選項

CDB 命令視窗

如果調試程式已經作用中,您可以輸入 .attach -v(附加至進程) 命令,以非侵入性地偵錯執行中的進程。

如果調試程式已經以侵入性方式偵錯一或多個進程,您可以使用 .attach 命令。

如果 .attach -v 命令成功,調試程式會在下次調試程式發出執行命令時偵錯指定的進程。 由於在非侵入式偵錯期間不允許執行,調試程式一次無法對多個進程進行非侵入性偵錯。 這項限制也表示使用 .attach -v 命令可能會使現有的侵入式偵錯會話變得不太有用。

繁衍新進程

CDB 可以啟動使用者模式應用程式,然後對應用程式進行偵錯。 應用程式是以名稱指定。 調試程式也可以自動附加至子進程(原始目標進程啟動的其他進程)。

調試程式所建立的進程(也稱為繁衍進程)的行為與調試程式未建立的進程稍有不同。

調試程式所建立的進程不使用標準堆積 API,而是使用特殊的偵錯堆積。 您可以使用 _NO_DEBUG_HEAP 環境變數-hd 命令行選項,強制繁衍進程使用標準堆積,而不是偵錯堆積。

此外,因為目標應用程式是調試程式的子進程,所以它會繼承調試程序的許可權。 此許可權可能會讓目標應用程式執行無法執行的特定動作。 例如,目標應用程式可能會影響受保護的進程。

在 [命令提示字元] 視窗中,您可以在啟動 CDB 時繁衍新的進程。 輸入下列命令。

cdb [-o] ProgramName [Arguments]

-o 選項會使調試程式附加至子進程。 還有數個其他實用的命令行選項。 如需命令行語法的詳細資訊,請參閱CDB命令行選項

如果調試程式已經偵錯一或多個進程,您可以輸入 .create (Create Process) 命令來建立新的進程。

除非部分線程已凍結或暫停,否則調試程式一律會同時啟動多個目標進程。

如果 .create 命令成功,調試程式會在下次調試程式發出執行命令時建立指定的進程。 如果您在一個數據列中使用此命令數次,則調試程式必須要求執行多次,才能使用此命令。

您可以使用 .createdir (Set Created Process Directory) 命令,在 .create 之前控制應用程式的起始目錄 您可以使用 .createdir -I 命令或 -noinh 命令行選項來控制目標應用程式是否繼承調試程式的句柄。

您可以使用 .childdbg (偵錯子行程) 命令來啟動或停用子進程的偵錯。

重新附加至進程

如果調試程式停止響應或凍結,您可以將新的調試程式附加至目標進程。 如需如何在這種情況中附加調試程式的詳細資訊,請參閱 重新附加至目標應用程式