Registrieren des Programms
Nachdem das Debugmodul einen Port erworben hat, dargestellt durch eine IDebugPort2-Schnittstelle , besteht der nächste Schritt in der Aktivierung des Debugprogramms darin, ihn beim Port zu registrieren. Nach der Registrierung steht das Programm für das Debuggen auf einem der folgenden Methoden zur Verfügung:
Der Prozess des Anfügens, der es dem Debugger ermöglicht, vollständige Debugsteuerelemente einer ausgeführten Anwendung zu erhalten.
Just-in-Time(JIT)-Debugging, das das Nachdebuggen eines Programms ermöglicht, das unabhängig von einem Debugger ausgeführt wird. Wenn die Laufzeitarchitektur einen Fehler erfasst, wird der Debugger benachrichtigt, bevor das Betriebssystem oder die Laufzeitumgebung den Speicher und die Ressourcen des fehlerhaften Programms freigibt.
Registrieren des Verfahrens
So registrieren Sie Ihr Programm
Rufen Sie die vom Port implementierte AddProgramNode-Methode auf.
IDebugPortNotify2::AddProgramNode
erfordert einen Zeiger auf eine IDebugProgramNode2-Schnittstelle .Wenn das Betriebssystem oder die Laufzeitumgebung ein Programm lädt, wird normalerweise der Programmknoten erstellt. Wenn das Debugmodul (DE) aufgefordert wird, das Programm zu laden, erstellt und registriert der DE den Programmknoten.
Das folgende Beispiel zeigt das Debugmodul, das das Programm startet und es mit einem Port registriert.
Hinweis
Dieses Codebeispiel ist nicht die einzige Möglichkeit, einen Prozess zu starten und fortzusetzen; Dieser Code ist Standard beispiel für die Registrierung eines Programms mit einem Port.
// 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); }