Sdílet prostřednictvím


Dynamické ladění C++ (Preview)

Důležité

Dynamické ladění jazyka C++ je aktuálně ve verzi Preview. Tyto informace se týkají předběžné verze funkce, která se může před vydáním podstatně upravit. Společnost Microsoft neposkytuje žádné záruky, vyjádřené ani předpokládané, pokud jde o informace uvedené zde.

Tato funkce Preview, která je dostupná od sady Visual Studio 2022 verze 17.14 Preview 2, se vztahuje pouze na projekty x64.

Pomocí dynamického ladění jazyka C++ můžete ladit optimalizovaný kód, jako by byl neoptimalizovaný. Tato funkce je užitečná pro vývojáře, kteří vyžadují výhody výkonu optimalizovaného kódu, jako jsou vývojáři her, kteří potřebují vysokou míru snímků. Pomocí dynamického ladění jazyka C++ si můžete vychutnat zážitek z ladění neoptimalizovaného kódu, aniž byste obětovali výkonnostní výhody optimalizovaných sestavení.

Ladění optimalizovaného kódu představuje výzvy. Kompilátor přemísťuje a reorganizuje pokyny pro optimalizaci kódu. Výsledek je efektivnější kód, ale znamená to:

  • Optimalizátor může odebrat místní proměnné nebo je přesunout do umístění neznámých pro ladicí program.
  • Kód uvnitř funkce už nemusí být v souladu se zdrojovým kódem, když optimalizátor sloučí bloky kódu.
  • Názvy funkcí v zásobníku volání můžou být chybné, pokud optimalizátor sloučí dvě funkce.

V minulosti se vývojáři zabývali těmito a dalšími problémy při ladění optimalizovaného kódu. Nyní jsou tyto výzvy eliminovány, protože pomocí dynamického ladění jazyka C++ můžete krokovat do optimalizovaného kódu, jako by byl neoptimalizovaný.

Kromě generování optimalizovaných binárních souborů kompilování pomocí /dynamicdeopt generuje neoptimalizované binární soubory, které se používají při ladění. Když do funkce přidáte zarážku nebo do ní vstoupíte (včetně funkcí __forceinline), ladicí program načte neoptimalizovaný binární kód. Pak můžete ladit neoptimalizovaný kód pro funkci místo optimalizovaného kódu. Ladění můžete provést tak, jako kdybyste ladili neoptimalizovaný kód, zatímco stále získáte výhody výkonu optimalizovaného kódu ve zbývající části programu.

Vyzkoušení dynamického ladění jazyka C++

Nejprve si projdeme, jaké to je ladit optimalizovaný kód. Pak uvidíte, jak dynamické ladění C++ zjednodušuje proces.

  1. Vytvořte nový projekt konzolové aplikace C++ v sadě Visual Studio. Obsah souboru ConsoleApplication.cpp nahraďte následujícím kódem:

    // Code generated by GitHub Copilot
    #include <iostream>
    #include <chrono>
    #include <thread>
    
    using namespace std;
    
    int step = 0;
    const int rows = 20;
    const int cols = 40;
    
    void printGrid(int grid[rows][cols])
    {
        cout << "Step: " << step << endl;
        for (int i = 0; i < rows; ++i)
        {
            for (int j = 0; j < cols; ++j)
            {
                cout << (grid[i][j] ? '*' : ' ');
            }
            cout << endl;
        }
    }
    
    int countNeighbors(int grid[rows][cols], int x, int y)
    {
        int count = 0;
        for (int i = -1; i <= 1; ++i)
        {
            for (int j = -1; j <= 1; ++j)
            {
                if (i == 0 && j == 0)
                {
                    continue;
                }
    
                int ni = x + i;
                int nj = y + j;
                if (ni >= 0 && ni < rows && nj >= 0 && nj < cols)
                {
                    count += grid[ni][nj];
                }
            }
        }
        return count;
    }
    
    void updateGrid(int grid[rows][cols])
    {
        int newGrid[rows][cols] = { 0 };
        for (int i = 0; i < rows; ++i)
        {
            for (int j = 0; j < cols; ++j)
            {
                int neighbors = countNeighbors(grid, i, j);
                if (grid[i][j] == 1)
                {
                    newGrid[i][j] = (neighbors < 2 || neighbors > 3) ? 0 : 1;
                }
                else
                {
                    newGrid[i][j] = (neighbors == 3) ? 1 : 0;
                }
            }
        }
        // Copy newGrid back to grid
        for (int i = 0; i < rows; ++i)
        {
            for (int j = 0; j < cols; ++j)
            {
                grid[i][j] = newGrid[i][j];
            }
        }
    }
    
    int main()
    {
        int grid[rows][cols] = { 0 };
    
        // Initial configuration (a simple glider)
        grid[1][2] = 1;
        grid[2][3] = 1;
        grid[3][1] = 1;
        grid[3][2] = 1;
        grid[3][3] = 1;
    
        while (true)
        {
            printGrid(grid);
            updateGrid(grid);
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
            cout << "\033[H\033[J"; // Clear the screen
            step++;
        }
    
        return 0;
    }
    
  2. Změňte rozevírací seznam konfigurací řešení na Verze. Ujistěte se, že rozevírací seznam platformy řešení je nastavený na x64.

  3. Znovu sestavit vybráním Sestavení>Znovu sestavit řešení.

  4. Nastavte bod přerušení na řádku 55, int neighbors = countNeighbors(grid, i, j); v updateGrid(). Spusťte program.

  5. Po dosažení zarážky zobrazte okno Místní hodnoty. V hlavní nabídce vyberte Ladění>Windows>Místní. Všimněte si, že v okně i nevidíte hodnotu j ani . Kompilátor je optimalizoval a odstranil.

  6. Zkuste nastavit zarážku na řádku 19, cout << (grid[i][j] ? '*' : ' '); v printGrid(). Nemůžete. Toto chování se očekává, protože kompilátor optimalizoval kód.

Zastavte program a povolte dynamické ladění C++ a zkuste to znovu.

  1. Ve Průzkumníku řešeníklikněte pravým tlačítkem na projekt a poté vyberte Vlastnosti pro otevření stránek vlastností projektu.

  2. Vyberte Pokročilé>Použít dynamické ladění C++a změňte nastavení na Ano.

    snímek obrazovky s rozšířenými vlastnostmi projektu

    Stránka vlastností se otevře na Vlastnosti konfigurace > Pokročilé > Dynamické ladění v C++. Vlastnost je nastavena na Ano.

    Tento krok přidá /dynamicdeopt přepínač do kompilátoru a linkeru. Na pozadí také vypne přepínače optimalizace C++ /GL a /OPT:ICF. Toto nastavení nepřepíše přepínače, které jste přidali ručně do příkazového řádku nebo jiných přepínačů optimalizace, které jsou nastavené, například /O1.

  3. Znovu sestavit vybráním Sestavení>Znovu sestavit řešení. Zobrazí se diagnostický kód sestavení MSB8088, který indikuje, že dynamické ladění a optimalizace celého programu nejsou kompatibilní. Tato chyba znamená, že během kompilace se automaticky vypnula celá optimalizace programu (/GL).

    Ve vlastnostech projektu můžete ručně vypnout optimalizaci celého programu. Vyberte Vlastnosti konfigurace>Rozšířené>Optimalizace celého programua změňte nastavení na Vypnuto. Nyní MSB8088 se považuje za upozornění, ale v budoucí verzi sady Visual Studio to může být považováno za chybu.

  4. Spusťte aplikaci znovu.

    Když se teď dostanete na zarážku na řádku 55, zobrazí se hodnoty i a j v okně Lokální. Okno Zásobník volání ukazuje, že updateGrid() je neoptimalizován a název souboru je life.alt.exe. Tento alternativní binární soubor slouží k ladění optimalizovaného kódu.

    snímek obrazovky znázorňující ladění funkce updateGrid

    Zarážka se zobrazí ve funkci updateGrid. Zásobník volání ukazuje, že funkce je neoptimalizovaná a název souboru je life.alt.exe. V okně Místní hodnoty se zobrazují hodnoty i a j a další místní proměnné ve funkci.

    Funkce updateGrid() je na požádání deoptimalizována, protože jste v ní nastavili bod přerušení. Pokud při ladění přejdete přes optimalizovanou funkci, není zrušena její optimalizace. Pokud vstoupíte do funkce, dojde k její deoptimalizaci. Hlavním způsobem, jak způsobit deoptimalizaci funkce, je nastavit v ní zarážku nebo přejít do ní.

    Funkci můžete také deoptimalizovat v okně Zásobník volání. Klikněte pravým tlačítkem myši na funkci nebo na vybranou skupinu funkcí a vyberte Deoptimalizovat u další položky. Tato vlastnost je užitečná, když chcete zobrazit místní proměnné v optimalizované funkci, pro kterou jste jinde v zásobníku volání nezadali bod přerušení. Funkce, které jsou tímto způsobem deoptimalizovány, jsou seskupeny v okně zarážky jako skupina zarážek s názvem Deoptimized Functions. Pokud odstraníte skupinu zarážek, přidružené funkce se vrátí do optimalizovaného stavu.

Použijte podmíněné a závislé body přerušení

  1. Zkuste znovu nastavit zarážku na řádku 19, cout << (grid[i][j] ? '*' : ' '); v printGrid(). Teď to funguje. Nastavení zarážky ve funkci vede k její deoptimalizaci, takže ji můžete běžně ladit.

  2. Klikněte pravým tlačítkem myši na zarážku na řádku 19, vyberte Podmínkya nastavte podmínku na i == 10 && j== 10. Potom zaškrtněte políčko Povolit pouze v případech, kdy je nalezena následující zarážka: zaškrtávací políčko. V rozevíracím seznamu vyberte bod přerušení na řádku 55. Teď se zarážka na řádku 19 neaktivuje, dokud není aktivována zarážka na řádku 50 jako první, a pak když se grid[10][10] chystá odeslat výstup do konzoly.

    Cílem je nastavit podmíněné a závislé zarážky v optimalizované funkci a využívat místní proměnné a řádky kódu, které v optimalizovaném sestavení nemusí být pro ladicí program k dispozici.

    Snímek obrazovky znázorňující nastavení podmíněných zarážek pro řádek 19

    Podmíněná zarážka je ukázána na řádku 19, cout < < (grid[i][j] ? '*' : ' ');. Podmínka je nastavená na i == 10 && j== 10. Zaškrtnuto je políčko, které umožňuje povolit pouze v případě, že je zasažena následující zarážka. Rozevírací seznam zarážek je nastaven na řádek 55 v souboru life.cpp.

  3. Pokračujte ve spuštění aplikace. Po dosažení zarážky na řádku 19 můžete kliknout pravým tlačítkem myši na řádek 15 a vybrat Nastavit další příkaz a znovu spustit smyčku.

    snímek obrazovky znázorňující ladění funkce printGrid

    Podmíněný a závislý bod přerušení je dosažen na řádku 19, cout < < (mřížka[i][j] ? '*' : ' ');. V okně Místní hodnoty se zobrazují hodnoty i a j a další místní proměnné ve funkci. Okno Zásobník volání ukazuje, že funkce je neoptimalizovaná a název souboru je life.alt.exe.

  4. Odstraňte všechny zarážky, abyste vrátili neoptimalizované funkce do optimalizovaného stavu. V hlavní nabídce sady Visual Studio vyberte Ladit>Odstranit všechny zarážky. Všechny funkce se pak vrátí do optimalizovaného stavu.

    Pokud přidáte body přerušení prostřednictvím okna Zásobník volání pomocí možnosti Deoptimalizovat u další položky, což jsme v tomto návodu neudělali, můžete kliknout pravým tlačítkem na skupinu Funkce deoptimalizované a vybrat Odstranit, aby se jen funkce v této skupině vrátily do optimalizovaného stavu.

    snímek obrazovky, který ukazuje okno Zarážky.

    V okně Lomové body se zobrazí skupina Deoptimalizované funkce. Skupina je vybraná a místní nabídka je otevřena s vybranou možností Odstranit skupinu bodů přerušení.

Vypnutí dynamického ladění C++

Možná budete muset ladit optimalizovaný kód, aniž by byl deoptimalizován, nebo vložit zarážku do optimalizovaného kódu a zajistit, aby kód zůstal optimalizován, když zarážka zasáhne. Existuje několik způsobů, jak vypnout dynamické ladění nebo zabránit znehodnocení optimalizace kódu při dosažení místa přerušení:

  • V hlavní nabídce sady Visual Studio vyberte Možnosti nástrojů>. V podokně Možnosti rozbalte část Všechna nastavení>ladění>obecné. Zrušte zaškrtnutí políčka Automaticky deoptimalizovat laděné funkce, pokud je to možné (.NET 8+, Dynamické ladění jazyka C++). Při příštím spuštění ladicího programu zůstane kód optimalizovaný.
  • V hlavní nabídce sady Visual Studio vyberte Možnosti nástrojů>. V dialogovém okně Možnosti rozbalte část ladění>Obecné. Zrušte zaškrtnutí políčka Automaticky deoptimalizovat laděné funkce, pokud je to možné (.NET 8+, Dynamické ladění jazyka C++). Při příštím spuštění ladicího programu zůstane kód optimalizovaný.
  • Mnoho dynamických zarážek ladění je ve skutečnosti tvořeno dvěma zarážkami: jedna je v optimalizovaném binárním souboru a druhá v neoptimalizovaném binárním souboru. V okně Zarážky vyberte Zobrazit sloupce>funkce. Vymažte zarážku přidruženou k binárnímu souboru alt. Druhý bod přerušení ve dvojici je přerušen v optimalizovaném kódu.
  • Při ladění v hlavní nabídce sady Visual Studio vyberte Ladění>Windows>Disassembly. Ujistěte se, že je zaostřeno. Když vstoupíte do funkce přes okno Disassembly, funkce nebude deaktivována.
  • Zakažte dynamické ladění úplně tím, že nepředáte /dynamicdeopt do cl.exe, lib.exe a link.exe. Pokud používáte knihovny třetích stran a nemůžete je znovu sestavit, nepředávejte /dynamicdeopt během konečného link.exe a zakažte dynamické ladění tohoto binárního souboru.
  • Pokud chcete rychle zakázat dynamické ladění pro jeden binární soubor (například test.dll), přejmenujte nebo odstraňte binární alt (například test.alt.dll).
  • Chcete-li zakázat dynamické ladění pro jeden nebo více .cpp souborů, nepředávejte /dynamicdeopt během jejich sestavování. Zbývající část projektu je sestavena pomocí Dynamického ladění.

Povolení dynamického ladění C++ pro unreal Engine 5.6 nebo novější

Unreal Engine 5.6 podporuje dynamické ladění C++ pro unreal Build Tool i Unreal Build Accelerator. Existují dva způsoby, jak ji povolit. Buď upravte BuildConfiguration.xml soubor, nebo upravte Targets.cs soubor.

Upravit BuildConfiguration.xml soubor

V sadě Visual Studio vyberte konfiguraci vývojového editoru a upravte BuildConfiguration.xml ji tak, aby zahrnovala <bDynamicDebugging>true</bDynamicDebugging>. Další informace o BuildConfiguration.xml a jeho umístění najdete v tématu Konfigurace sestavení.

  1. Jedním ze způsobů, jak najít BuildConfiguration.xml soubor, je spustit sestavení a zkontrolovat výstup protokolu sestavení. Například při sestavování úvodní hry Lyra se zobrazí výstup podobný tomuto:

    - Running UnrealBuildTool: dotnet "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" LyraEditor Win64 Development -Project="C:\LyraStarterGame\LyraStarterGame.uproject" ...
     14% -   Log file: C:\Users\<user>\AppData\Local\UnrealBuildTool\Log.txt
    
  2. Vyhledejte Log.txt pro BuildConfiguration.xml. Měl by obsahovat řádek jako Reading configuration file from: C:\LyraStarterGame\Saved\UnrealBuildTool\BuildConfiguration.xml

  3. Upravte soubor BuildConfiguration.xml, aby obsahoval <bDynamicDebugging>true</bDynamicDebugging>:

    <?xml version="1.0" encoding="utf-8" ?>
    <Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
        <WindowsPlatform>
            <bDynamicDebugging>true</bDynamicDebugging> <!-- add this line -->
        </WindowsPlatform>
    </Configuration>
    

Upravit Targets.cs soubor

Dalším způsobem, jak povolit dynamické ladění jazyka C++ pro unreal Build Tool i Unreal Build Accelerator, je upravit soubor Target.cs tak, aby obsahoval WindowsPlatform.bDynamicDebugging = true.

Projekty unreal Engine mají Target.cs soubory přidružené k několika cílovým typům, včetně:

{ProjectName}.Target.cs for the game executable.
{ProjectName}Editor.Target.cs for the editor build.

Pro sestavení editoru {ProjectName}Editor.Target.cs v souboru přidejte WindowsPlatform.bDynamicDebugging = true; do konstruktoru:

public class LyraEditorTarget : TargetRules
{
    public LyraEditorTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Editor;

        WindowsPlatform.bDynamicDebugging = true; // add this line
        // Other settings...
    }
}

Nebo pro sestavení hry, v souboru {ProjectName}.Target.cs přidejte WindowsPlatform.bDynamicDebugging = true; do ApplyShared{Project name}TargetSettings():

internal static void ApplySharedLyraTargetSettings(TargetRules Target)
{
    ILogger Logger = Target.Logger;
    
    WindowsPlatform.bDynamicDebugging = true; // add this line
    // Other settings...
}

Další informace o cílových souborech unreal Engine naleznete v tématu Cíle.

Povolení dynamického ladění C++ pro unreal Engine 5.5 nebo starší

V případě Unreal Engine 5.5 nebo starších přebírejte změny nástroje Unreal Build Tool z GitHubu do úložiště.

Poznámka:

Pokud chcete získat přístup k úložištím Epic na GitHubu, potřebujete účet Epic a zaregistrovaný účet GitHub.

Po výběru změn, které se mají v úložišti použít, povolte bDynamicDebugging , jak je popsáno výše. Musíte také použít unreal Build Accelerator z Unreal Engine 5.6. Buď použijte nejnovější bity z ue5-main, nebo zakažte UBA přidáním následujícího kódu do BuildConfiguration.xml:

<BuildConfiguration>
    <bAllowUBAExecutor>false</bAllowUBAExecutor>
    <bAllowUBALocalExecutor>false</bAllowUBALocalExecutor>
</BuildConfiguration>

Další informace o konfiguraci sestavení Unreal Engine naleznete v tématu Konfigurace sestavení.

Řešení problémů

Pokud se body přerušení nespustí v deoptimalizovaných funkcích:

  • Pokud vystoupíte z rámce [Deoptimized], můžete být v optimalizovaném kódu, pokud nebyl volající neoptimalizován kvůli zarážce v něm nebo pokud jste při cestě k aktuální funkci vstoupili do volajícího.

  • Ujistěte se, že jsou vytvořené soubory alt.exe a alt.pdb. Pro test.exe a test.pdb, test.alt.exe a test.alt.pdb musí existovat ve stejném adresáři. Ujistěte se, že jsou nastaveny správné přepínače sestavení podle tohoto článku.

  • V debug directory existuje položka test.exe, kterou ladicí program používá k nalezení binárního souboru alt, jenž se má použít pro deoptimalizované ladění. Otevřete příkazový řádek sady Visual Studio nativní pro x64 a spusťte link /dump /headers <your executable.exe>, abyste zjistili, jestli deopt položka existuje. Položka deopt se zobrazí ve sloupci Type, jak je znázorněno na posledním řádku tohoto příkladu:

      Debug Directories
    
            Time Type        Size      RVA  Pointer
        -------- ------- -------- -------- --------
        67CF0DA2 cv            30 00076330    75330    Format: RSDS, {7290497A-E223-4DF6-9D61-2D7F2C9F54A0}, 58, D:\work\shadow\test.pdb
        67CF0DA2 feat          14 00076360    75360    Counts: Pre-VC++ 11.00=0, C/C++=205, /GS=205, /sdl=0, guardN=204
        67CF0DA2 coffgrp      36C 00076374    75374
        67CF0DA2 deopt         22 00076708    75708    Timestamp: 0x67cf0da2, size: 532480, name: test.alt.exe
    

    Pokud položka ladicího adresáře deopt neexistuje, ověřte, že /dynamicdeopt předáváte do cl.exe, lib.exea link.exe.

  • Dynamická deoptimalizace nebude fungovat konzistentně, pokud /dynamicdeopt není předána do cl.exe, lib.exea link.exe pro všechny .cpp, .liba binární soubory. Ověřte, že jsou při sestavování projektu nastavené správné přepínače.

Další informace o známých problémech naleznete v tématu dynamické ladění C++: Úplná debuggibilita pro optimalizovaná sestavení.

Pokud věci nefungují podle očekávání, vytvořte ticket v komunitě vývojářů . Uveďte co nejvíce informací o problému.

Obecné poznámky

IncrediBuild 10.24 podporuje dynamické ladění sestavení C++.
FastBuild verze 1.15 podporuje sestavení dynamického ladění jazyka C++.

Funkce, které jsou vloženy, jsou na vyžádání deoptimalizované. Pokud nastavíte bod přerušení u vložené funkce, ladicí program deoptimalizuje ji i funkci jejího volajícího. Bod přerušení zasáhne tam, kde očekáváte, jako kdyby byl váš program sestaven bez optimalizací kompilátoru.

Funkce zůstane neoptimalizovaná, i když zarážky v ní zakážete. Aby se funkce vrátila do optimalizovaného stavu, musíte odstranit bod přerušení.

Mnoho dynamických zarážek ladění je ve skutečnosti tvořeno dvěma zarážkami: jedna je v optimalizovaném binárním souboru a druhá v neoptimalizovaném binárním souboru. Z tohoto důvodu vidíte v okně Přerušovací body více než jeden přerušovací bod.

Příznaky kompilátoru, které se používají pro deoptimalizovanou verzi, jsou stejné jako příznaky, které se používají pro optimalizovanou verzi, s výjimkou příznaků optimalizace a /dynamicdeopt. Toto chování znamená, že všechny příznaky, které jste nastavili pro definování maker a tak dále, jsou nastavené také ve verzi bez optimalizace.

Neoptimalizovaný kód není stejný jako ladicí kód. Deoptimalizovaný kód je zkompilován se stejnými příznaky optimalizace jako optimalizovaná verze, proto nejsou zahrnuty aserty a další kód, který spoléhá na nastavení určené pro ladění.

Sestavení integrace systému

Dynamické ladění jazyka C++ vyžaduje, aby byly příznaky kompilátoru a linkeru nastaveny určitým způsobem. Následující části popisují, jak nastavit vyhrazenou konfiguraci pro dynamické ladění, která nemá konfliktní přepínače.

Pokud je váš projekt sestaven pomocí systému sestavení Visual Studio, dobrým způsobem, jak vytvořit konfiguraci dynamického ladění, je použít Správce konfigurace k naklonování konfigurace pro vydání nebo pro ladění a provést změny, které vyhovují dynamickému ladění. Následující dvě části popisují postupy.

Vytvořit novou konfiguraci pro vydání

  1. V hlavní nabídce sady Visual Studio vyberte Build>Configuration Manager a otevřete Configuration Manager.

  2. Vyberte rozevírací seznam Konfigurace a pak vyberte <Nový...>.

    snímek obrazovky s nástrojem Configuration Manager.

    V nástroji Configuration Manager je v části Kontexty projektu otevřený rozevírací seznam Konfigurace a zvýrazněný .

  3. Otevře se dialogové okno Nová konfigurace řešení. Do pole Název zadejte název nové konfigurace, například ReleaseDD. Ujistěte se, že Nastavení kopírování z: je nastaveno na Release. Potom vyberte OK a vytvořte novou konfiguraci.

    Snímek obrazovky s dialogovým oknem Konfigurace nového projektu pro sestavení vydané verze

    Pole Název je nastavené na ReleaseDD. Rozevírací seznam 'Kopírovat nastavení z' je nastaven na Release.

  4. Nová konfigurace se zobrazí v rozevíracím seznamu Konfigurace aktivního řešení. Vyberte Zavřít.

  5. V rozevíracím seznamu Konfigurace nastavený na ReleaseDDklikněte pravým tlačítkem na projekt v Průzkumníku řešení a vyberte Vlastnosti.

  6. Ve vlastnostech konfigurace >Rozšířenénastavte Použít dynamické ladění C++ na Ano.

  7. Ujistěte se, že je optimalizace celého programu nastavena na Žádná optimalizace.

    snímek obrazovky s rozšířenými vlastnostmi projektu

    Stránka vlastností se otevře ve vlastnostech konfigurace > Upřesnit. Použijte dynamické ladění jazyka C++. Vlastnost je nastavena na Ano. Optimalizace celého programu je nastavená na Ne.

  8. V Vlastnosti konfigurace>Linker>Optimalizacezajistěte, aby Povolit skládání COMDAT bylo nastaveno na Ne (/OPT:NOICF).

    Snímek obrazovky, který ukazuje vlastnosti projektu optimalizace linkeru.

    Stránka vlastností se otevře v části Vlastnosti konfigurace > Linker > Optimalizace > Povolit skládání CMDAT. Vlastnost je nastavena na Ne (/OPT:NOICF).

Toto nastavení přidá přepínač /dynamicdeopt do kompilátoru a linkeru. S vypnutými přepínači optimalizace /GL a /OPT:ICF jazyka C++ nyní můžete sestavit a spustit projekt v nové konfiguraci, pokud chcete optimalizovaný release build, které můžete s dynamickým laděním C++ použít.

Do této konfigurace můžete přidat další přepínače, které používáte s finálními verzemi, abyste měli vždy přesně zapnuté nebo vypnuté přepínače, jak očekáváte při použití funkce dynamického ladění. Další informace o přepínačích, které byste neměli používat s dynamickým laděním, naleznete v tématu Nekompatibilní možnosti.

Další informace o konfiguracích v sadě Visual Studio najdete v tématu Vytvoření a úprava konfigurací.

Vytvoření nové konfigurace ladění

Pokud chcete použít binární soubory ladění, ale chcete, aby běžely rychleji, můžete upravit konfiguraci ladění.

  1. V hlavní nabídce sady Visual Studio vyberte Build>Configuration Manager a otevřete Configuration Manager.

  2. Vyberte rozevírací seznam Konfigurace a pak vyberte <Nový...>.

    snímek obrazovky s nástrojem Configuration Manager.

    V nástroji Configuration Manager je v části Kontexty projektu okna otevřený rozbalovací seznam Konfigurace a zvýrazněno .

  3. Otevře se dialogové okno Nová konfigurace projektu. Do pole Název zadejte název nové konfigurace, například DebugDD. Ujistěte se, že Nastavení kopírování z: jsou nastaveny na Ladění. Potom vyberte OK a vytvořte novou konfiguraci.

    Snímek obrazovky zobrazující dialogové okno Nová konfigurace projektu pro ladicí sestavení.

    Pole s názvem je nastavené na DebugDD. Nastavení kopírování z: rozevírací seznam je nastaven na Ladit.

  4. Nová konfigurace se zobrazí v rozevíracím seznamu Konfigurace aktivního řešení. Vyberte Zavřít.

  5. V rozevíracím seznamu Konfigurace nastaveném na DebugDDklikněte pravým tlačítkem myši na váš projekt v Průzkumníku řešení a vyberte Vlastnosti.

  6. V Vlastnosti konfigurace>C/C++>Optimalizacezapněte požadované optimalizace. Můžete například nastavit optimalizace tak, aby se maximalizovala rychlost (/O2).

  7. V C/C++>generování kódunastavte základní běhové kontroly na Výchozí.

  8. V C/C++>Obecné, zakažte Podpora ladění pouze mého kódu.

  9. Nastavte formát informací o ladění na Program Database (/Zi).

Do této konfigurace můžete přidat další přepínače, které používáte s ladicími sestaveními, abyste měli vždy přesně ty přepínače zapnuté nebo vypnuté, které očekáváte při použití dynamického ladění. Další informace o přepínačích, které byste neměli používat s dynamickým laděním, naleznete v tématu Nekompatibilní možnosti.

Další informace o konfiguracích v sadě Visual Studio najdete v tématu Vytvoření a úprava konfigurací.

Úvahy o vlastním systému sestavení

Pokud máte vlastní systém sestavení, ujistěte se, že:

  • Předejte /dynamicdeopt do cl.exe, lib.exe, a link.exe.
  • Nepoužívejte /ZI, žádný z příznaků /RTC ani /JMC.

Pro distributoři pro sestavení:

  • Pro projekt s názvem testkompilátor vytvoří test.alt.obj, test.alt.exp, test.obja test.exp. Linker vytváří test.alt.exe, test.alt.pdb, test.exea test.pdb.
  • Je potřeba nasadit nový binární soubor nástrojů c2dd.dll, spolu s c2.dll.

Nekompatibilní možnosti

Některé možnosti kompilátoru a linkeru nejsou kompatibilní s dynamickým laděním jazyka C++. Pokud zapnete dynamické ladění C++ pomocí nastavení projektu sady Visual Studio, nekompatibilní možnosti se automaticky vypnou, pokud je výslovně nenastavíte v nastavení dalších možností příkazového řádku.

Následující možnosti kompilátoru nejsou kompatibilní s dynamickým laděním jazyka C++:

/GH
/GL
/Gh
/RTC1 
/RTCc 
/RTCs 
/RTCu 
/ZI (/Zi is OK)
/ZW 
/clr 
/clr:initialAppDomain
/clr:netcore
/clr:newSyntax
/clr:noAssembly
/clr:pure
/clr:safe
/fastcap
/fsanitize=address
/fsanitize=kernel-address

Následující možnosti linkeru nejsou kompatibilní s dynamickým laděním jazyka C++:

/DEBUG:FASTLINK
/INCREMENTAL
/OPT:ICF  You can specify /OPT:ICF but the debugging experience may be poor

Viz také

příznak kompilátoru /dynamicdeopt (náhled)
Příznak linkeru /DYNAMICDEOPT (preview)
C++ Dynamické ladění: Úplná možnost ladění optimalizovaných sestavení
Ladění optimalizovaného kódu