註冊程式
偵錯引擎取得以 IDebugPort2 介面表示的連接埠之後,啟用程式偵錯的下一個步驟是使用連接埠註冊該程式。 註冊之後,程式即可透過下列其中一種方法進行偵錯:
連結的程式,可讓偵錯工具全權控制對執行中的應用程式進行偵錯。
Just-In-Time (JIT) 偵錯,允許獨立於偵錯工具之外執行程式的事後偵錯。 當執行階段架構攔截到錯誤時,會在作業系統或執行階段環境釋放錯誤程式的記憶體和資源之前,通知偵錯工具。
註冊程序
註冊您的程式
呼叫連接埠所實作的 AddProgramNode 方法。
IDebugPortNotify2::AddProgramNode
需要 IDebugProgramNode2 介面的指標。通常,當作業系統或執行階段環境載入程式時,它會建立程式節點。 如果要求偵錯引擎 (DE) 載入程式,DE 會建立並註冊程式節點。
下列範例顯示偵錯引擎啟動程式,並使用連接埠註冊該程式。
注意
此程式碼範例不是啟動和繼續程式的唯一方式;此程式碼主要是使用連接埠註冊程式的範例。
// This is an IDebugEngineLaunch2 method. HRESULT CDebugEngine::LaunchSuspended(/* omitted parameters */, IDebugPort2 *pPort, /* omitted parameters */, IDebugProcess2**ppDebugProcess) { // do stuff here to set up for a launch (such as handling the other parameters) ... // Now get the IPortNotify2 interface so we can register a program node // in CDebugEngine::ResumeProcess. CComPtr<IDebugDefaultPort2> spDefaultPort; HRESULT hr = pPort->QueryInterface(&spDefaultPort); if (SUCCEEDED(hr)) { CComPtr<IDebugPortNotify2> spPortNotify; hr = spDefaultPort->GetPortNotify(&spPortNotify); if (SUCCEEDED(hr)) { // Remember the port notify so we can use it in ResumeProcess. m_spPortNotify = spPortNotify; // Now launch the process in a suspended state and return the // IDebugProcess2 interface CComPtr<IDebugPortEx2> spPortEx; hr = pPort->QueryInterface(&spPortEx); if (SUCCEEDED(hr)) { // pass on the parameters we were given (omitted here) hr = spPortEx->LaunchSuspended(/* omitted parameters */,ppDebugProcess) } } } return(hr); } HRESULT CDebugEngine::ResumeProcess(IDebugProcess2 *pDebugProcess) { // Make a program node for this process HRESULT hr; CComPtr<IDebugProgramNode2> spProgramNode; hr = this->GetProgramNodeForProcess(pProcess, &spProgramNode); if (SUCCEEDED(hr)) { hr = m_spPortNotify->AddProgramNode(spProgramNode); if (SUCCEEDED(hr)) { // resume execution of the process using the port given to us earlier. // (Querying for the IDebugPortEx2 interface is valid here since // that's how we got the IDebugPortNotify2 interface in the first place.) CComPtr<IDebugPortEx2> spPortEx; hr = m_spPortNotify->QueryInterface(&spPortEx); if (SUCCEEDED(hr)) { hr = spPortEx->ResumeProcess(pDebugProcess); } } } return(hr); }