Registrace programu
Jakmile ladicí modul získá port reprezentovaný rozhraním IDebugPort2 , dalším krokem při povolení ladění programu je jeho registrace na portu. Po registraci je program k dispozici pro ladění jedním z následujících způsobů:
Proces připojení, který umožňuje ladicímu programu získat úplné řízení ladění spuštěné aplikace.
Ladění za běhu (JIT), které umožňuje ladění programu po faktu, který běží nezávisle na ladicím programu. Když architektura za běhu zachytí chybu, ladicí program bude upozorněn před tím, než operační systém nebo běhové prostředí uvolní paměť a prostředky chybujícího programu.
Postup registrace
Registrace programu
Volání AddProgramNode metoda implementovaná portem.
IDebugPortNotify2::AddProgramNode
vyžaduje ukazatel na rozhraní IDebugProgramNode2 .Obvykle, když operační systém nebo prostředí za běhu načte program, vytvoří programový uzel. Pokud se zobrazí výzva k načtení programu ladicí modul (DE), vytvoří a zaregistruje programový uzel.
Následující příklad ukazuje ladicí modul, který program spustí a zaregistruje ho pomocí portu.
Poznámka:
Tento vzorový kód není jediným způsobem, jak spustit a obnovit proces; tento kód je hlavně příkladem registrace programu na portu.
// 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); }