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í
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řitWin32 Release
cíl. Kompilátor neoptimalizujeWin32 Debug
cíl.Vyberte projekt v Průzkumník řešení.
V nabídce Zobrazit klikněte na Stránky vlastností.
V dialogovém okně Stránky vlastností se ujistěte, že
Debug
je vybrána v rozevíracím seznamu Konfigurace .V zobrazení složek vlevo vyberte složku C/C++ .
Ve složce C++ vyberte
Optimization
.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
Pokud jste zvolili
Custom
možnostOptimization
, můžete nyní nastavit možnosti pro kteroukoli z dalších vlastností zobrazených v seznamu vlastností.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.