Ladění optimalizovaného kódu

Poznámka:

Dialogová okna a příkazy nabídek, které vidíte, se mohou lišit od těch popsaných v nápovědě v závislosti na aktivních nastaveních nebo edici. Pokud chcete změnit nastavení, zvolte v nabídce Nástroje možnost Importovat a exportovat Nastavení. Další informace najdete v tématu Resetování všech nastavení.

Poznámka:

Možnost kompilátoru /Zo (vylepšit optimalizované ladění) (představená v sadě Visual Studio Update 3) generuje bohatší informace o ladění pro optimalizovaný kód (projekty, které nejsou sestaveny pomocí možnosti kompilátoru /Od . Viz /O Možnosti (optimalizace kódu)). To zahrnuje vylepšenou podporu ladění místních proměnných a vložených funkcí.

Možnost Upravit a pokračovat je zakázána při použití možnosti kompilátoru /Zo .

Když kompilátor optimalizuje kód, přemísťuje a reorganizuje pokyny. Výsledkem je efektivnější kompilovaný kód. Kvůli tomuto změně uspořádání nemůže ladicí program vždy identifikovat zdrojový kód, který odpovídá sadě instrukcí.

Optimalizace může ovlivnit:

  • Místní proměnné, které může optimalizátor odebrat nebo přesunout do umístění, kterým ladicí program nerozumí.

  • Pozice uvnitř funkce, které se změní, když optimalizátor slučuje bloky kódu.

  • Názvy funkcí pro rámce v zásobníku volání, což může být chybné, pokud optimalizátor sloučí dvě funkce.

    Rámce, které vidíte v zásobníku volání, jsou téměř vždy správné, ale za předpokladu, že máte symboly pro všechny snímky. Rámce v zásobníku volání budou chybné, pokud máte poškození zásobníku, pokud máte funkce napsané v jazyce sestavení nebo pokud existují rámce operačního systému bez odpovídajících symbolů v zásobníku volání.

    Globální a statické proměnné se vždy zobrazují správně. Takže je rozložení struktury. Pokud máte ukazatel na strukturu a hodnota ukazatele je správná, zobrazí se správná hodnota každé členské proměnné struktury.

    Vzhledem k těmto omezením byste měli ladit pomocí neoptimalizované verze programu, pokud je to vůbec možné. Ve výchozím nastavení je optimalizace vypnutá v konfiguraci ladění programu C++ a je zapnutá v konfiguraci vydané verze.

    Chyba se ale může objevit pouze v optimalizované verzi programu. V takovém případě je nutné ladit optimalizovaný kód.

Zapnutí optimalizace v konfiguraci sestavení ladění

  1. Při vytváření nového projektu vyberte Win32 Debug cíl. Win32 Debug Použijte cíl, dokud nebude program plně laděný a vy jste připraveni vytvořit Win32 Release cíl. Kompilátor neoptimalizuje Win32 Debug cíl.

  2. Vyberte projekt v Průzkumník řešení.

  3. V nabídce Zobrazit klikněte na Stránky vlastností.

  4. V dialogovém okně Stránky vlastností se ujistěte, že Debug je vybrána v rozevíracím seznamu Konfigurace .

  5. V zobrazení složek vlevo vyberte složku C/C++ .

  6. Ve složce C++ vyberte Optimization.

  7. V seznamu vlastností napravo najděte Optimization. Nastavení vedle něj pravděpodobně říká Disabled (/Od). Zvolte jednu z dalších možností (Minimum Size``(/O1),Maximum Speed``( /O2),Full Optimization``( /Ox) nebo ).Custom

  8. Pokud jste zvolili Custom možnost Optimization, můžete nyní nastavit možnosti pro kteroukoli z dalších vlastností zobrazených v seznamu vlastností.

  9. Vyberte vlastnosti konfigurace, C/C++, uzel příkazového řádku na stránce vlastností projektu a přidejte (/Zo) do textového pole Další možnosti.

    Upozorňující

    Přidání /Zo zakáže úpravy a pokračování.

    Při ladění optimalizovaného kódu pomocí okna zpětného překladu zjistíte, jaké pokyny se skutečně vytvoří a spustí. Když nastavíte zarážky, musíte vědět, že se zarážka může pohybovat společně s pokyny. Představte si například následující kód:

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

Předpokládejme, že jste na tomto řádku nastavili zarážku. Možná očekáváte, že se zarážka dosáhne 10krát, ale pokud je kód optimalizovaný, dosáhnete zarážky jenom jednou. Je to proto, že první instrukce nastaví hodnotu x na 0. Kompilátor rozpozná, že to stačí udělat jenom jednou, a přesune ho mimo smyčku. Zarážka se s ní přesune. Pokyny, které porovnávají a inkrementuje x , zůstanou uvnitř smyčky. Při zobrazení okna zpětného překladu je jednotka kroku automaticky nastavena na Instrukce pro větší kontrolu, což je užitečné při procházení optimalizovaného kódu.