Регистрация программы
После того как модуль отладки приобрел порт, представленный интерфейсом IDebugPort2 , следующий шаг при включении отладки программы — зарегистрировать его с помощью порта. После регистрации программа доступна для отладки одним из следующих средств:
Процесс присоединения, позволяющий отладчику получить полный контроль отладки запущенного приложения.
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); }