共用方式為


控制線程和進程

如需調試程式引擎中線程和進程的概觀,請參閱 線程和進程

事件發生時,事件線程和事件進程會設定為事件發生所在的線程和進程(作系統或虛擬)。 您可以分別使用 GetEventThreadGetEventProcess 找到它們。

隱含線程和進程

在內核模式偵錯中,調試程式引擎會使用 隱含進程 來判斷執行虛擬位址轉譯時要使用的虛擬位址空間,例如 ,在 VirtualToPhysicalReadVirtual 方法中。 當事件發生時,隱含進程會設定為目前的進程。

您可以使用 SetImplicitProcessDataOffset 來變更隱含進程。 若要判斷隱含進程,請使用 GetImplicitProcessDataOffset

注意 在即時核心偵錯會話期間設定 斷點 時,調試程式引擎會將斷點的虛擬位址傳遞至目標,而目標會設定斷點。 在此情況下,處理斷點時只會使用目標的進程內容;隱含進程的值無關緊要。

在內核模式偵錯中,調試程式引擎會使用 隱含線程 來判斷目標的某些 緩存器。 這包括處理器堆疊(請參閱 GetStackOffset)、框架位移(請參閱 GetFrameOffset),以及指令位移(請參閱 GetInstructionOffset)。 當事件發生時,隱含線程會設定為目前的線程。

您可以使用 SetImplicitThreadDataOffset 來變更隱含線程。 若要判斷隱含線程,請使用 GetImplicitThreadDataOffset

並非所有暫存器都是由隱含執行緒所決定。 有些暫存器會在隱式執行緒改變時保持不變。

警告 隱含進程和隱含線程是獨立的。 如果隱含線程不屬於隱含進程,則隱含線程的使用者和會話狀態會位於錯誤的虛擬位址空間中,而嘗試存取這項資訊會導致錯誤或提供不正確的結果。 存取核心記憶體時不會發生此問題,因為核心記憶體位址在所有虛擬位址空間中都是固定的。 因此,可以存取位於核心記憶體中的隱含線程資訊,與隱含進程無關。

線程

調試程式引擎會使用 引擎線程標識碼 來識別目標的每個作系統線程和每個虛擬線程。

當目標停止時,每個執行緒也會有與其所屬進程相關的索引。 對於任何進程,進程中第一個線程的索引為零,而最後一個線程的索引則是進程中的線程數目減一。 您可以使用 GetNumberThreads 找到目前進程中的線程數目。 您可以使用 GetTotalNumberThreads 找到目前目標中所有進程中的線程總數。

您可以使用 GetThreadIdsByIndex,從其索引中找到目前進程中一或多個線程的引擎線程標識碼和系統線程標識碼。

引擎會維護每個線程的數個相關信息。 這項資訊可能會針對目前的線程進行查詢,而且可用來尋找線程的引擎線程標識符。

系統線程識別碼(僅限使用者模式偵錯)
您可以使用 GetCurrentThreadSystemId 找到目前線程的系統線程標識碼。 針對指定的系統線程標識碼,可以使用 GetThreadIdBySystemId 找到對應的引擎線程標識碼。

線程環境區塊 (TEB)
您可以使用 GetCurrentThreadTeb 找到目前線程的 TEB 位址。 針對指定的 TEB 位址,可以使用 GetThreadIdByTeb 找到對應的引擎線程標識碼。 在內核模式偵錯中,(虛擬) 線程的TEB是發生最後一個事件時在對應處理器上執行的系統線程TEB。

數據位移
在使用者模式偵錯中,(系統)線程的數據位移是該線程的TEB位置。 在內核模式偵錯中,一個(虛擬)線程的數據偏移量是發生最後一個事件時正在相應處理器上運行的系統線程的KTHREAD結構。 您可以使用 GetCurrentThreadDataOffset 找到目前線程的數據位移。 針對指定的數據位移,可以使用 GetThreadIdByDataOffset 找到對應的引擎線程標識碼。

系統句柄
您可以使用 GetCurrentThreadHandle 找到目前線程的系統句柄。 針對指定的系統句柄,可以使用 GetThreadIdByHandle 找到對應的引擎線程標識碼。 在內核模式偵錯中,會為每個 (虛擬) 進程建立人工句柄。 此句柄只能與調試程式引擎 API 查詢搭配使用。

過程

調試程式引擎會使用 引擎進程標識碼 來識別每個作系統進程和目標的每個虛擬進程。

當目標停止時,每個進程都有相對於目標的索引。 目標中第一個進程的索引為零,而最後一個進程的索引則是目標中的進程數目減一。 您可以使用 GetNumberProcesses 找到目前目標中的進程數目。

您可以使用 GetProcessIdsByIndex,從其索引中找到目前目標中一或多個線程的引擎進程識別碼和系統進程標識碼。

引擎會維護每個程式的相關數項資訊。 這項資訊可能會針對目前的進程進行查詢,並可用來尋找進程的引擎進程標識碼。

系統行程識別碼 (僅限使用者模式偵錯)
您可以使用 GetCurrentProcessSystemId 找到目前進程的系統進程識別碼。 針對指定的系統進程標識碼,可以使用 GetProcessIdBySystemId 找到對應的引擎進程標識碼。

進程環境區塊 (PEB)
您可以使用 GetCurrentProcessPeb 找到目前進程的 PEB 位址。 針對指定的PEB位址,可以使用 GetProcessIdByPeb 找到對應的引擎進程標識碼。 在內核模式偵錯中,(虛擬) 進程的PEB是發生最後一個事件時執行之系統進程的PEB。

數據位移
在使用者模式偵錯中,(系統) 進程的數據位移是該程式PEB的位置。 在內核模式偵錯中,(虛擬) 進程的數據位移是發生最後一個事件時執行之系統進程的 KPROCESS 結構。 您可以使用 GetCurrentProcessDataOffset 找到目前進程的數據位移。 針對指定的數據位移,可以使用 GetProcessIdByDataOffset 找到對應的引擎進程標識碼。

系統句柄
您可以使用 GetCurrentProcessHandle 找到目前進程的系統句柄。 針對指定的系統句柄,可以使用 GetProcessIdByHandle 找到對應的引擎進程識別碼。 在內核模式偵錯中,會為(虛擬)流程建立人工句柄。 此句柄只能與調試程式引擎查詢搭配使用。

事件

在實時使用者模式偵錯中,每當目標中建立或結束線程時,就會產生 create-thread 和 exit-thread 偵錯事件。 這些事件會導致呼叫 IDebugEventCallbacks::CreateThreadIDebugEventCallbacks::ExitThread 回呼方法。

在即時使用者模式偵錯中,每當在目標中建立或結束進程時,就會產生建立進程和結束進程偵錯事件。 這些事件會導致呼叫 IDebugEventCallbacks::CreateProcessIDebugEventCallbacks::ExitProcess 回呼方法。

如需事件的詳細資訊,請參閱 監視事件

其他資訊

如需有關執行緒和進程的詳細資訊,包括 TEB、KTHREAD、PEB 和 KPROCESS 結構,請參閱 David Solomon 和 Mark Russinovich 合著的 Microsoft Windows 內部結構