Udostępnij przez


Kontrola wykonywania

Aparat debugowania (DE) zwykle wysyła jedno z następujących zdarzeń jako ostatnie zdarzenie uruchamiania:

  • Zdarzenie punktu wejścia, jeśli dołączane do nowo uruchomionego programu

  • Zdarzenie zakończenia ładowania, jeśli dołączamy do programu, który jest już uruchomiony

    Oba te zdarzenia są zdarzeniami zatrzymującymi, co oznacza, że DE czeka na odpowiedź od użytkownika przy użyciu środowiska IDE. Aby uzyskać więcej informacji, zobacz Tryby operacyjne.

Zatrzymywanie zdarzenia

Po wysłaniu zdarzenia zatrzymania do sesji debugowania:

  1. Program i wątek zawierający bieżący wskaźnik instrukcji można uzyskać z interfejsu zdarzenia.

  2. IDE określa bieżący plik i pozycję kodu źródłowego, które są wyświetlane jako wyróżnione w edytorze.

  3. Sesja debugowania zwykle reaguje na to pierwsze zatrzymanie zdarzenia, wywołując metodę Continue programu.

  4. Program jest następnie uruchamiany do momentu napotkania warunku zatrzymania, takiego jak osiągnięcie punktu przerwania. W takim przypadku DE wysyła zdarzenie punktu przerwania do sesji debugowania. Zdarzenie punktu przerwania jest zdarzeniem zatrzymania wykonywania programu, a DE ponownie czeka na odpowiedź użytkownika.

  5. Jeśli użytkownik zdecyduje się wejść do funkcji, przejść nad nią lub wyjść z niej, środowisko IDE wyświetli monit o wywołanie metody programu Step. Następnie środowisko IDE przekazuje krok (instrukcję, wyrażenie lub linię) oraz typ kroku (czy wchodzić do funkcji, przechodzić przez, czy wychodzić z funkcji). Po zakończeniu kroku, DE wysyła zdarzenie ukończenia kroku do sesji debugowania, jako zdarzenie zatrzymania.

    — lub —

    Jeśli użytkownik zdecyduje się kontynuować wykonywanie z bieżącego wskaźnika instrukcji, środowisko IDE monituje sesję debugowania o wywołanie metody Execute programu. Program wznawia wykonywanie, dopóki nie napotka następnego warunku zatrzymania.

    — lub —

    Jeśli sesja debugowania ma ignorować określone zdarzenie zatrzymania, sesja debugowania wywołuje metodę Continue programu. Jeśli program wchodził do funkcji, przechodził nad nią lub wychodził z niej, gdy napotkał warunek zatrzymania, to kontynuuje wykonywanie kroku.

    Programowo, gdy DE napotka warunek zatrzymania, wysyła do menedżera debugowania sesji (SDM) zdarzenia zatrzymania, takie jak IDebugLoadCompleteEvent2 lub IDebugEntryPointEvent2, za pośrednictwem interfejsu IDebugEventCallback2. DE przekazuje interfejsy IDebugProgram2 i IDebugThread2, które reprezentują program oraz wątek zawierający bieżący wskaźnik instrukcji. Narzędzie SDM wywołuje IDebugThread2::EnumFrameInfo, aby uzyskać szczytową ramkę stosu i wywołuje IDebugStackFrame2::GetDocumentContext, aby uzyskać kontekst dokumentu powiązany z aktualnym wskaźnikiem instrukcji. Ten kontekst dokumentu jest zazwyczaj nazwą pliku kodu źródłowego, wierszem i numerem kolumny. Środowisko IDE używa tych elementów do wyróżniania kodu źródłowego zawierającego bieżący wskaźnik instrukcji.

    SdM zwykle reaguje na to pierwsze zatrzymanie zdarzenia przez wywołanie IDebugProgram2::Continue. Następnie program jest uruchamiany, aż napotka warunek zatrzymania, taki jak osiągnięcie punktu przerwania; w takiej sytuacji DE wysyła Interfejs IDebugBreakpointEvent2 do SDM. Zdarzenie punktu przerwania jest zdarzeniem zatrzymania, a DE ponownie czeka na odpowiedź użytkownika.

    Jeśli użytkownik zdecyduje się wejść do funkcji, przejść przez nią lub wyjść z niej, środowisko IDE wyświetli monit, aby SDM wywołał IDebugProgram2::Step. Następnie środowisko IDE przekazuje element STEPUNIT (instrukcję, polecenie lub wiersz) i STEPKIND, czyli czy przejść do wnętrza funkcji, nad nią, lub z niej wyjść. Po zakończeniu kroku DE wysyła interfejs IDebugStepCompleteEvent2 do SDM, co jest zdarzeniem zatrzymania.

    Jeśli użytkownik zdecyduje się kontynuować wykonywanie z bieżącego wskaźnika instrukcji, IDE prosi SDM o wywołanie IDebugProgram2::Execute. Program wznawia wykonywanie, dopóki nie napotka następnego warunku zatrzymania.

    Jeśli pakiet debugowania ma ignorować określone zdarzenie zatrzymania, pakiet debugowania wywołuje SDM, który wywołuje IDebugProgram2::Continue. Jeśli program wchodził w, przechodził nad lub opuszczał funkcję, gdy napotkał warunek zatrzymania, kontynuuje ten krok. Oznacza to, że program utrzymuje tryb krokowy, dzięki czemu wie, jak kontynuować.

    Wywołania sdM wykonywane do Step, Execute i Continue są asynchroniczne, co oznacza, że SDM oczekuje, że wywołanie zostanie zwrócone szybko. Jeśli de wysyła SDM zdarzenie zatrzymania w tym samym wątku przed Step, Wykonaj lub Kontynuuj powróci, SDM przestanie odpowiadać.