Porady: debugowanie zoptymalizowanego kodu
[!UWAGA]
Okna dialogowe i polecenia menu mogą się różnić od tych opisanych w Pomocy, w zależności od ustawień aktywnych lub wydania.Aby zmienić ustawienia, należy wybrać ustawień importu i eksportu w menu Narzędzia.Aby uzyskać więcej informacji, zobacz Dostosowywanie ustawień środowiska deweloperskiego w Visual Studio.
[!UWAGA]
/Zo (rozszerzanie zoptymalizowanego debugowania)Opcję kompilatora (wprowadzona w programie Visual Studio, aktualizacja 3) generuje informacje o debugowaniu rozbudowane zoptymalizowanego kodu (projekty, które nie są tworzone z wszystkie opcję kompilatora.See /O Opcje (optymalizuj kod)).Dotyczy to również lepszą obsługę zmienne lokalne i inlined funkcji debugowania.
Edytuj i Kontynuuj jest wyłączona, gdy /Zo służy opcja ocompiler.
Gdy kompilator pozwala lepiej kodu, zmiana i Reorganizuje instrukcje.Powoduje to efektywniejsze skompilowany kod.Z powodu tego modyfikacji debuger nie może zidentyfikować zawsze umożliwiająca zestaw instrukcji kodu źródłowego.
Optymalizacja może mieć wpływ na:
Zmienne lokalne, które mogą zostać usunięte przez optimizer lub przeniesiony do lokalizacji, których nie rozpoznaje debuger.
Pozycje wewnątrz funkcji, które zostały zmienione w momencie optimizer scalania bloków kodu.
Nazwy funkcji ramek na stosie wywołań, które może być nieprawidłowy, jeśli optimizer łączy dwie funkcje.
Ramki, które są wyświetlane na stosie wywołań są prawie zawsze poprawne, jednak pod warunkiem, że masz symboli dla wszystkich ramek.Jeśli masz uszkodzeniem stosu, jeśli został napisany w języku zestawu funkcji, czy istnieją ramki systemu operacyjnego bez zgodnych symboli na stosie wywołań będą nieprawidłowe ramek na stosie wywołań.
Zmienne globalne i statyczne są zawsze wyświetlane prawidłowo.Jest to struktura układu.Jeśli masz wskaźnika do struktury, a wartość wskaźnika jest poprawna, co zmienna członka struktury będzie widoczna poprawną wartość.
Ze względu na ograniczenia te można debugować za pomocą niezoptymalizowanego wersji programu, gdy to możliwe.Domyślnie optymalizacji jest wyłączona w konfiguracji debugowania programu Visual C++ i włączona w wersji konfiguracji.
Jednak usterkę może być wyświetlane tylko w zoptymalizowana wersja programu.W takim przypadku należy debugowania zoptymalizowanego kodu.
Aby włączyć funkcję optymalizacji podczas debugowania tworzenia konfiguracji
Podczas tworzenia nowego projektu, wybierz Win32 Debug docelowego.Użyj Win32Debug celem aż do swojego programu jest w pełni debugowania i można przystąpić do tworzenia Win32 Release docelowego.Kompilator nie zoptymalizować Win32 Debug docelowego.
Wybierz projekt w Eksploratorze rozwiązań.
Na widoku menu, kliknij przycisk strony właściwości.
W strony właściwości okno dialogowe upewnij się, wpisz Debug jest wybierany w konfiguracji listy rozwijanej.
W widoku folder po lewej stronie wybierz C/C++ folder.
W obszarze C++ folder, wybierz Optimization.
Na liście po prawej stronie właściwości Znajdź Optimization.Ustawienie obok prawdopodobnie mówi Disabled (wszystkie).Choose one of the other options (Minimum Size(/O1), Maximum Speed(/O2), Full Optimization(/Ox), or Custom).
Jeśli została wybrana opcja Custom opcji dla Optimization, można teraz ustawić opcje jakichkolwiek innych właściwości wyświetlane na liście właściwości.
Wybierz właściwości podręczną, C/C++ węzeł wiersza polecenia stronie właściwości projektu i dodać (/Zo) do dodatkowe opcje polu tekstowym.
Przestroga /Zowymaga programu Visual Studio 2013 Update 3 lub nowszy.
Dodawanie /Zo spowoduje wyłączenie Edytuj i Kontynuuj.
Podczas debugowania zoptymalizowanego kodu, użyj demontażu okna, aby zobaczyć, jakie instrukcje faktycznie są tworzone i wykonane.Po ustawieniu punktów przerwania, musisz wiedzieć, że punkt przerwania mogą przenieść wraz z instrukcji.Na przykład rozważmy następujący kod:
for (x=0; x<10; x++)
Załóżmy, że ustawienia punktu przerwania w tym wierszu.Może oczekiwać punkt przerwania, aby mieć trafić 10 razy, ale jeśli kod jest zoptymalizowany, punkt przerwania jest trafień tylko jeden raz.Wynika to z pierwszej instrukcji, która ustawia wartość x na 0.Kompilator uznaje, że to tylko raz dokonać przenosi go z pętli.Punkt przerwania przesuwa się z nim.Instrukcje, które porównania i zwiększyć x pozostają wewnątrz pętli.Podczas wyświetlania demontażu oknie jednostki kroku jest automatycznie ustawiana instrukcja większą kontrolę, która jest przydatna podczas przechodzenia do kolejnych zoptymalizowanego kodu.