Partager via


Inscrire le programme

Une fois que le moteur de débogage a acquis un port, représenté par une interface IDebugPort2 , l’étape suivante pour permettre au programme d’être débogué consiste à l’inscrire auprès du port. Une fois inscrit, le programme est disponible pour le débogage par l’un des moyens suivants :

  • Processus d’attachement, qui permet au débogueur d’obtenir un contrôle de débogage complet d’une application en cours d’exécution.

  • Débogage juste-à-temps (JIT), qui permet le débogage après le fait d’un programme qui s’exécute indépendamment d’un débogueur. Lorsque l’architecture d’exécution intercepte une erreur, le débogueur est averti avant que le système d’exploitation ou l’environnement d’exécution libère la mémoire et les ressources du programme d’erreur.

Procédure d’inscription

Pour inscrire votre programme

  1. Appelez la méthode AddProgramNode implémentée par le port.

    IDebugPortNotify2::AddProgramNode nécessite un pointeur vers une interface IDebugProgramNode2 .

    En règle générale, lorsque le système d’exploitation ou l’environnement d’exécution charge un programme, il crée le nœud du programme. Si le moteur de débogage (DE) est invité à charger le programme, le DE crée et inscrit le nœud du programme.

    L’exemple suivant montre le moteur de débogage qui lance le programme et l’inscrit avec un port.

    Remarque

    Cet exemple de code n’est pas le seul moyen de lancer et de reprendre un processus ; ce code est principalement un exemple d’inscription d’un programme avec un 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);
    }