Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln beskrivs vilka kompilatorväxlar som ska ställas in så att du kan felsöka optimerad kod bättre.
En bättre upplevelse är tillgänglig från och med Visual Studio 2022 version 17.14 som gör att du kan felsöka optimerad kod som om den kompilerats ooptimerad, samtidigt som hastigheten för optimerad kod bibehålls. Mer information finns i C++ Dynamisk felsökning (förhandsversion).
Anmärkning
De dialogrutor och menykommandon som du ser kan skilja sig från de som beskrivs i Hjälp beroende på dina aktiva inställningar eller utgåva. Om du vill ändra inställningarna väljer du Inställningar för import och export på menyn Verktyg. Mer information finns i Återställ alla inställningar.
Anmärkning
Alternativet /Zo (Förbättra optimerad felsökning) kompilatoralternativet (som introducerades i Visual Studio Update 3) genererar mer detaljerad felsökningsinformation för optimerad kod (projekt som inte har skapats med kompileringsalternativet /Od. Se /O-alternativ (Optimera Kod)). Detta omfattar förbättrat stöd för felsökning av lokala variabler och inlindade funktioner.
Redigera och Fortsätt inaktiveras när kompileringsalternativet /Zo används.
När kompilatorn optimerar koden flyttas och ordnas instruktionerna om. Detta resulterar i effektivare kompilerad kod. På grund av den här omorganiseringen kan felsökaren inte alltid identifiera källkoden som motsvarar en uppsättning instruktioner.
Optimering kan påverka:
Optimeraren kan ta bort lokala variabler eller flytta dem till platser som felsökaren inte förstår.
Positioner i en funktion, som ändras när optimeraren sammanfogar kodblock.
Funktionsnamn för ramar i anropsstacken, vilket kan vara fel om optimeraren sammanfogar två funktioner.
De bildrutor som visas i anropsstacken är nästan alltid korrekta, men förutsatt att du har symboler för alla bildrutor. Ramarna i anropsstacken kommer att vara felaktiga om du har korruption i stacken, om du har funktioner skrivna i assembler, eller om det finns operativsystemramar utan matchande symboler i anropsstacken.
Globala och statiska variabler visas alltid korrekt. Så är även strukturlayouten. Om du har en pekare till en struktur och pekarens värde är korrekt, visar varje medlemsvariabel i strukturen rätt värde.
På grund av dessa begränsningar bör du felsöka med en ooptimerad version av programmet om det är möjligt. Som standard inaktiveras optimeringen i felsökningskonfigurationen för ett C++-program och aktiveras i versionskonfigurationen.
En bugg kan dock bara visas i en optimerad version av ett program. I så fall måste du felsöka den optimerade koden.
Aktivera optimering i en konfiguration för felsökningsversion
När du skapar ett nytt projekt väljer du det
Win32 Debugmålet. Använd måletWin32 Debugtills programmet är helt felsökt och du är redo att skapa ettWin32 Releasemål. Kompilatorn optimerar inteWin32 Debugmål.Välj projektet i Solution Explorer.
På menyn Visa klickar du på Egenskapssidor.
I dialogrutan Egenskapssidor kontrollerar du att
Debugär markerat i listrutan Konfiguration.I mappvyn till vänster väljer du mappen C/C++.
Under mappen C++ väljer du
Optimization.Leta upp
Optimizationi egenskapslistan till höger. Inställningen bredvid säger förmodligenDisabled (/Od). Välj något av de andra alternativen (Minimum Size``(/O1),Maximum Speed``(/O2),Full Optimization``(/Ox)ellerCustom).Om du väljer alternativet
CustomförOptimizationkan du nu ange alternativ för någon av de andra egenskaperna som visas i egenskapslistan.Välj Konfigurationsegenskaper, C/C++, kommandoradsnod på sidan för projektegenskaper och lägg till
(/Zo)i rutan Ytterligare alternativ .Varning
Om du lägger till
/Zoinaktiveras Redigera och Fortsätt.När du felsöker optimerad kod använder du fönstret Disassembly för att se vilka instruktioner som skapas och körs. När du anger brytpunkter måste du veta att brytpunkten kan flyttas tillsammans med en instruktion. Tänk till exempel på följande kod:
for (x=0; x<10; x++)
Anta att du anger en brytpunkt på den här raden. Du kan förvänta dig att brytpunkten nås 10 gånger, men om koden är optimerad slås brytpunkten endast en gång. Det beror på att den första instruktionen anger värdet för x till 0. Kompilatorn känner igen att detta bara behöver göras en gång och flyttar det från loopen. Brytpunkten flyttas med den. Instruktionerna som jämför och ökar x finns kvar i loopen. När du visar fönstret Disassembly anges stegenhet automatiskt till Instruktion för större kontroll, vilket är användbart när du går igenom optimerad kod.