Megosztás a következőn keresztül:


Optimalizált kód hibakeresése

Ez a cikk ismerteti, hogy mely fordítókapcsolókat kell beállítani az optimalizált kód hatékonyabb hibakeresésének érdekében.

Jobb élmény érhető el a Visual Studio 2022 17.14-es verziójától kezdve, amely lehetővé teszi az optimalizált kód hibakeresését úgy, mintha az optimalizálatlan fordítás lenne, miközben megtartja az optimalizált kód sebességét. További információ: C++ dinamikus hibakeresési (előzetes verzió).

Megjegyzés

A megjelenő párbeszédpanelek és menüparancsok eltérhetnek az aktív beállításoktól vagy kiadástól függően a Súgóban leírtaktól. A beállítások módosításához válassza Importálási és exportálási beállítások lehetőséget az Eszközök menüben. További információ: Az összes beállítás alaphelyzetbe állítása.

Megjegyzés

A /Zo (Fokozza az optimalizált hibakeresést) fordítóbeállítás (a Visual Studio 3. frissítésében bevezetett) részletesebb hibakeresési információkat hoz létre az optimalizált kódhoz (a projektek nem a /Od fordítóbeállítással készültek). Lásd: /O-beállítások (Kód optimalizálása)). Ez magában foglalja a helyi változók és beágyazott függvények hibakeresésének továbbfejlesztett támogatását.

Szerkesztés és folytatás letiltva van, amikor a /Zo fordító opció van használva.

Amikor a fordító optimalizálja a kódot, áthelyezi és átrendezi az utasításokat. Ez hatékonyabb lefordított kódot eredményez. Az átrendezés miatt a hibakereső nem tudja mindig azonosítani az utasításoknak megfelelő forráskódot.

Az optimalizálás hatással lehet a következőre:

  • Az optimalizáló eltávolíthatja a helyi változókat, vagy áthelyezheti őket olyan helyekre, amelyeket a hibakereső nem ért.

  • Függvényen belüli pozíciók, amelyek módosulnak, amikor az optimalizáló egyesít egy kódblokkot.

  • A hívásverem kereteinek függvénynevei, amelyek helytelenek lehetnek, ha az optimalizáló két függvényt egyesít.

    A hívásveremen látható keretek azonban szinte mindig helyesek, feltéve, hogy az összes keretekhez szimbólumok tartoznak. A hívásverem keretei hibásak lesznek, ha veremsérülése van, ha a függvények szerelvénynyelven vannak megírva, vagy ha vannak olyan operációsrendszer-keretek, amelyeken nincsenek egyező szimbólumok a hívásveremen.

    A globális és statikus változók mindig helyesen jelennek meg. A struktúra elrendezése is. Ha egy szerkezetre mutató mutatóval rendelkezik, és a mutató értéke helyes, a struktúra minden tagváltozója a megfelelő értéket jeleníti meg.

    A korlátozások miatt érdemes hibakeresést végeznie a program nem optimalizált verziójának használatával, ha egyáltalán lehetséges. Alapértelmezés szerint az optimalizálás ki van kapcsolva egy C++ program hibakeresési konfigurációjában, és be van kapcsolva a kiadási konfigurációban.

    Előfordulhat azonban, hogy egy hiba csak egy program optimalizált verziójában jelenik meg. Ebben az esetben hibakeresést kell végeznie az optimalizált kódon.

Az optimalizálás bekapcsolása hibakeresési buildkonfigurációban

  1. Új projekt létrehozásakor válassza ki a Win32 Debug célt. Használja a Win32 Debug-célpontot, amíg a program teljesen hibamentes, és készen áll a Win32 Release-cél felépítésére. A fordító nem optimalizálja a Win32 Debug célpontot.

  2. Válassza ki a projektet a Megoldáskezelőben.

  3. A Nézet menüben kattintson a(z) Tulajdonságlapokelemre.

  4. A Tulajdonságlapok párbeszédpanelen győződjön meg arról, hogy a Debug ki van jelölve a Konfiguráció legördülő listában.

  5. A bal oldali mappanézetben válassza a C/C++ mappát.

  6. A C++ mappában válassza a Optimizationlehetőséget.

  7. A jobb oldali tulajdonságok listájában keresse meg a Optimization. A mellette található beállítás valószínűleg Disabled (/Od). Válasszon másik lehetőséget (Minimum Size``(/O1), Maximum Speed``(/O2), Full Optimization``(/Ox)vagy Custom).

  8. Ha a OptimizationCustom beállítását választotta, a tulajdonságok listájában szereplő többi tulajdonsághoz is megadhat beállításokat.

  9. Jelölje ki a projekt tulajdonságainak oldalán a Konfigurációs tulajdonságok, C/C++, Parancssor csomópontot, majd adja hozzá a (/Zo) értékeket a További beállítások szövegmezőhöz.

    Figyelmeztetés

    A /Zo hozzáadása letiltja a szerkesztés és folytatás funkciót.

    Az optimalizált kód hibakeresésekor a Szétbontás ablakban megtekintheti, hogy milyen utasítások jönnek létre és hajthatók végre. A töréspontok beállításakor tudnia kell, hogy a töréspont egy utasítással együtt mozoghat. Vegyük például a következő kódot:

for (x=0; x<10; x++)

Tegyük fel, hogy ezen a soron töréspontot állított be. Előfordulhat, hogy a töréspont 10 alkalommal lép, de ha a kód optimalizálva van, a töréspont csak egyszer lép. Ennek az az oka, hogy az első utasítás a x értékét 0 értékre állítja. A fordító felismeri, hogy ezt csak egyszer kell elvégezni, és áthelyezi a hurokból. A töréspont vele együtt mozog. Az összehasonlítást és növelést végző x utasítások a hurokban maradnak. A Szétszerelés ablak megtekintésekor a lépésegység automatikusan Utasítás értékre van állítva a nagyobb vezérlés érdekében, ami akkor hasznos, ha optimalizált kóddal lép végig.