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


C++ dinamikus hibakeresés (előzetes verzió)

Fontos

A C++ dinamikus hibakeresés jelenleg előzetes verzióban. Ezek az információk egy előzetes funkcióra vonatkoznak, amely a kiadás előtt jelentősen módosulhat. A Microsoft nem vállal kifejezett vagy hallgatólagos szavatosságot az itt megadott információkra vonatkozóan.

Ez az előzetes verziójú funkció, amely a Visual Studio 2022 17.14 Előzetes verzió 2-es verziójától kezdve érhető el, csak x64-es projektekre vonatkozik.

A C++ dinamikus hibakereséssel az optimalizált kód hibakeresését úgy végezheti el, mintha az nem lenne optimális. Ez a funkció olyan fejlesztők számára hasznos, akik az optimalizált kód teljesítménybeli előnyeit igénylik, például a nagy képkockasebességre szoruló játékfejlesztők számára. A C++ dinamikus hibakereséssel élvezheti a nem optimalizált kód hibakeresési élményét anélkül, hogy feláldozná az optimalizált buildek teljesítménybeli előnyeit.

Az optimalizált kód hibakeresése kihívást jelent. A fordító újrapozícionálja és átrendezi az utasításokat a kód optimalizálása érdekében. Az eredmény hatékonyabb kód, de a következőt jelenti:

  • Az optimalizáló eltávolíthatja a helyi változókat, vagy áthelyezheti őket a hibakereső számára ismeretlen helyekre.
  • Előfordulhat, hogy a függvényen belüli kód már nem felel meg a forráskódnak, amikor az optimalizáló egyesít kódblokkokat.
  • A hívásverem függvénynevei hibásak lehetnek, ha az optimalizáló két függvényt egyesít.

A fejlesztők korábban ezeket a problémákat és más problémákat kezelték, amikor optimalizált kód hibakeresése folyamatban volt. Most ezek a kihívások megszűnnek, mert a C++ dinamikus hibakereséssel úgy léphet az optimalizált kódba, mintha nem lenne optimális.

Az optimalizált bináris fájlok létrehozása mellett a /dynamicdeopt összeállítása optimalizálatlan bináris fájlokat hoz létre, amelyeket a hibakeresés során használnak. Ha töréspontot ad hozzá, vagy egy függvénybe lép (beleértve __forceinline függvényeket is), a hibakereső betölti a nem optimális bináris fájlt. Ezután az optimalizált kód helyett a függvény nem optimális kódját is hibakeresésre használhatja. A hibakeresést úgy végezheti el, mintha nem optimalizált kódot keresne, miközben továbbra is élvezheti az optimalizált kód teljesítménybeli előnyeit a program többi részében.

A C++ dinamikus hibakeresés kipróbálása

Először is tekintsük át, milyen az optimalizált kód hibakeresése. Ezután láthatja, hogy a C++ dinamikus hibakeresés hogyan egyszerűsíti a folyamatot.

  1. Hozzon létre egy új C++ konzolalkalmazás-projektet a Visual Studióban. Cserélje le a ConsoleApplication.cpp fájl tartalmát a következő kódra:

    // 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. Módosítsa a Megoldáskonfigurációk legördülő listában Kiadás-ra. Győződjön meg arról, hogy a megoldásplatform legördülő listája x64 van beállítva.

  3. Az újraépítéshez válassza a Build>Rebuild Solutionlehetőséget.

  4. Állítson be egy töréspontot az 55. sorban, int neighbors = countNeighbors(grid, i, j);updateGrid(). Futtassa a programot.

  5. A töréspont elérésekor tekintse meg a Helyiek ablakot. A főmenüben válassza Hibakeresés>Windows>Helyieklehetőséget. Figyelje meg, hogy a i vagy j értéke nem látható a Helyiek ablakban. A fordító optimalizálás során eltávolította őket.

  6. Próbálja meg beállítani a töréspontot a 19. sorban, cout << (grid[i][j] ? '*' : ' '); a printGrid()-ben. Nem lehet. Ez a viselkedés azért várható, mert a fordító optimalizálta a kódot.

Állítsa le a programot, és engedélyezze a C++ dinamikus hibakeresést, és próbálkozzon újra

  1. A Megoldáskezelőkattintson a jobb gombbal a projektre, és válassza a Tulajdonságok lehetőséget a projekttulajdonságok lapjainak megnyitásához.

  2. Válassza Speciális>A C++ dinamikus hibakeresésihasználata lehetőséget, és módosítsa a beállítást Igenértékre.

    A speciális projekttulajdonságokat bemutató képernyőkép.

    A tulajdonságlap megnyílik a Konfiguráció tulajdonságai > Speciális > A C++ dinamikus hibakeresés használata. A tulajdonság értéke Igen.

    Ez a lépés hozzáadja a /dynamicdeopt kapcsolót a fordítóhoz és a csatolóhoz. A színfalak mögött kikapcsolja a C++ optimalizálási kapcsolókat /GL és /OPT:ICF. Ez a beállítás nem írja felül azokat a kapcsolókat, amelyeket manuálisan adott hozzá a parancssorhoz vagy más beállított optimalizálási kapcsolókhoz, például /O1.

  3. Az újraépítéshez válassza a Build>Rebuild Solutionlehetőséget. Megjelenik a diagnosztikai kód MSB8088, amely azt jelzi, hogy a dinamikus hibakeresés és a teljes programoptimalizálás inkompatibilis. Ez a hiba azt jelenti, hogy a teljes programoptimalizálás (/GL) automatikusan ki lett kapcsolva a fordítás során.

    Manuálisan kikapcsolhatja a teljes programoptimalizálást a projekttulajdonságokban. Válassza Konfiguráció tulajdonságai>Speciális>Teljes programoptimalizáláslehetőséget, és módosítsa a beállítást kikapcsoltra . Most MSB8088 figyelmeztetésként lesz kezelve, de előfordulhat, hogy a Visual Studio egy későbbi verziójában hibaként kezelik.

  4. Futtassa újra az alkalmazást.

    Amikor eléri az 55. sorban a töréspontot, a i és j értékei a Helyiek ablakban láthatók. A Hívásverem ablakban látható, hogy a updateGrid() deoptimizált, a fájlnév pedig life.alt.exe. Ez a másodlagos bináris az optimalizált kód hibakeresésére szolgál.

    Az updateGrid függvény hibakeresését bemutató képernyőkép.

    Töréspont jelenik meg az updateGrid függvényben. A hívásverem azt mutatja, hogy a függvény inoptimizált, a fájlnév pedig life.alt.exe. A Helyiek ablak az i és j értékeket, valamint a függvény többi helyi változóját jeleníti meg.

    A updateGrid() függvény igény szerint deoptimizálódik, mert töréspontot állít be benne. Ha hibakeresés közben lép át egy optimalizált függvényen, az nem veszíti el az optimalizálást. Ha egy függvénybe lép, az deoptimalizálódik. A függvények inoptimizálásának fő módja, ha töréspontot állít be benne, vagy belelép.

    A függvényeket a Hívásverem ablakban is deoptimalizálhatja. Kattintson a jobb gombbal a függvényre vagy egy kijelölt függvénycsoportra, és válassza a Következő híváskor deoptimalizáljalehetőséget. Ez a funkció akkor hasznos, ha olyan optimalizált függvény helyi változóit szeretné megtekinteni, amelyekhez nem állított be töréspontot máshol a hívásveremen. Az ilyen módon deoptimizált függvények a Töréspontok ablakban vannak összegyűjtve, mint egy Deoptimalizált Függvényeknevű töréspontcsoport. Ha törli a töréspontcsoportot, a társított függvények visszaállnak az optimalizált állapotukra.

Feltételes és függő töréspontok használata

  1. Próbálja meg ismét beállítani a töréspontot a 19. sorban, cout << (grid[i][j] ? '*' : ' ');-ban és printGrid()-ben. Most már működik. Ha beállít egy töréspontot a függvényben, az de-optimalizálja azt, hogy a hibakeresést normál módon végezhesse el.

  2. Kattintson a jobb gombbal a töréspontra a 19. sorban, válassza a Feltételeklehetőséget, és állítsa a feltételt i == 10 && j== 10értékre. Ezután jelölje be a jelölőnégyzetet: Csak akkor engedélyezze, ha a következő töréspont elérve van:. Válassza ki az 55. sor töréspontját a legördülő listából. Most a 19. sorban lévő töréspont nem aktiválódik, amíg az 50. sorban lévő töréspont nem aktiválódott először, majd amikor grid[10][10] készen áll a konzolra történő kimenetre.

    A lényeg az, hogy feltételes és függő töréspontokat állíthat be egy optimalizált függvényben, és olyan helyi változókat és kódsorokat használhat, amelyek egy optimalizált buildben nem érhetők el a hibakereső számára.

    A 19. sor feltételes töréspont-beállításait bemutató képernyőkép.

    A feltételes töréspont megjelenik a 19. sorban, cout < < (tömb[i][j] ? '*' : ' ');. A feltétel értéke i == 10 && j== 10. A Csak akkor engedélyezze, ha a következő töréspont elérésekor jelölőnégyzet ki van választva. A töréspont legördülő listáját a life.cpp 55. sorára állították.

  3. Futtassa tovább az alkalmazást. A 19. sor töréspontjának elérésekor kattintson a jobb gombbal a 15. sorra, és válassza a Következő utasítás beállítása lehetőséget a ciklus újrafuttatásához.

    A printGrid függvény hibakeresését bemutató képernyőkép.

    A feltételesen és függően aktivált töréspont eléri a 19. sort, cout < < (grid[i][j] ? '*' : ' ');. A Helyiek ablak az i és j értékeket, valamint a függvény többi helyi változóját jeleníti meg. A Hívásverem ablakban látható, hogy a függvény inoptimizált, a fájlnév pedig life.alt.exe.

  4. Törölje az összes töréspontot, hogy a deoptimalizált függvények visszatérjenek az optimalizált állapotba. A Visual Studio főmenüjében válassza Hibakeresés>Az összes töréspont törléselehetőséget. Ezután minden függvény visszatér az optimalizált állapotba.

    Ha töréspontokat ad hozzá a Hívásverem ablakban a Deoptimize on next entry opcióval, amit ebben az útmutatóban nem tettünk meg, kattintson a jobb gombbal a Deoptimalizált függvények csoportra, és válassza a Törlés lehetőséget, hogy csak az adott csoport függvényeit állítsa vissza az optimalizált állapotba.

    A Töréspontok ablak képernyőképe.

    A Töréspontok ablakban látható a Deoptimized Functions csoport. A csoport ki van jelölve, és a helyi menü meg van nyitva a Töréspontcsoport törlése kijelölésével.

A C++ dinamikus hibakeresés kikapcsolása

Előfordulhat, hogy optimalizált kódot kell hibakeresni anélkül, hogy le lenne optimalizálva, vagy töréspontot helyezne egy optimalizált kódba, és a kód maradjon optimalizált, amikor az eléri a töréspontot. A dinamikus hibakeresést többféleképpen is kikapcsolhatja, vagy letilthatja a kód deoptimizálódását, ha töréspontot ér el:

  • A Visual Studio főmenüjében válassza az Eszközök>beállításai lehetőséget. A Beállítások panelen bontsa ki az Összes beállítás>hibakeresése általános>. Törölje a Hibakeresett funkciók automatikus optimalizálásának megszüntetése, amikor lehetséges (.NET 8+, C++ dinamikus hibakeresés) jelölőnégyzet jelölését. A hibakereső következő indításakor a kód optimalizálva marad.
  • A Visual Studio főmenüjében válassza az Eszközök>beállításai lehetőséget. A Beállítások párbeszédpanelen bontsa ki azÁltalános>. Törölje a Hibakeresett funkciók automatikus optimalizálásának megszüntetése, amikor lehetséges (.NET 8+, C++ dinamikus hibakeresés) jelölőnégyzet jelölését. A hibakereső következő indításakor a kód optimalizálva marad.
  • Számos dinamikus hibakeresési töréspontnál két töréspont található: egy az optimalizált binárisban, és egy a nem optimalizált binárisban. A Töréspontok ablakban válassza Oszlopok megjelenítése>funkciólehetőséget. Törölje a alt binárishoz társított töréspontot. A pár másik töréspontja az optimalizált kódban törik meg.
  • Hibakereséskor a Visual Studio főmenüjében válassza Hibakeresés>Windows>Szétszereléslehetőséget. Győződjön meg arról, hogy fókuszban van. Ha a Szétszerelés ablakban lép be egy függvénybe, a függvény nem lesz inoptimizálva.
  • Kapcsolja ki teljesen a dinamikus hibakeresést azáltal, hogy nem adja át a /dynamicdeopt-t a cl.exe, lib.exeés link.execímkének. Ha külső könyvtárakat használ, és nem tudja újraépíteni őket, ne adja át a /dynamicdeopt jelölőt az utolsó link.exe során a bináris dinamikus nyomkövetés letiltásához.
  • Ha gyorsan le szeretné tiltani egyetlen bináris (például test.dll) dinamikus hibakeresését, nevezze át vagy törölje a alt bináris fájlt (például test.alt.dll).
  • Ha egy vagy több .cpp fájl dinamikus hibakeresését szeretné letiltani, ne adjon át /dynamicdeopt a buildeléskor. A projekt hátralévő része dinamikus hibakereséssel készül.

C++ dinamikus hibakeresés engedélyezése az Unreal Engine 5.6-os vagy újabb verziójához

Az Unreal Engine 5.6 támogatja a C++ dinamikus hibakeresést az Unreal Build Tool és az Unreal Build Accelerator esetében is. Kétféleképpen engedélyezheti. Módosítsa a BuildConfiguration.xml fájlt, vagy módosítsa a Targets.cs fájlt.

A BuildConfiguration.xml fájl módosítása

A Visual Studióban válassza ki a Fejlesztési szerkesztő konfigurációt, és módosítsa BuildConfiguration.xml-t úgy, hogy belefoglalja <bDynamicDebugging>true</bDynamicDebugging>. További információ a BuildConfiguration.xml helyéről és a build konfigurációról.

  1. A BuildConfiguration.xml fájl megkeresésének egyik módja, ha futtat egy buildet, és ellenőrzi a build naplójának kimenetét. A Lyra Starter Game létrehozásakor például a következőhöz hasonló kimenet jelenik meg:

    - 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. Keressen rá a Log.txt következőre BuildConfiguration.xml: . Olyan sort kell tartalmaznia, mint Reading configuration file from: C:\LyraStarterGame\Saved\UnrealBuildTool\BuildConfiguration.xml

  3. Módosítsa úgy a BuildConfiguration.xml fájlt, hogy tartalmazza a következőket: <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>
    

A Targets.cs fájl módosítása

A C++ dinamikus hibakeresés engedélyezésének másik módja az Unreal Build Tool és az Unreal Build Accelerator esetében is, ha úgy módosítja a Target.cs fájlt, hogy tartalmazza WindowsPlatform.bDynamicDebugging = true.

Az Unreal Engine-projektekhez Target.cs több céltípushoz társított fájlok tartoznak, például:

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

Szerkesztői build esetén a {ProjectName}Editor.Target.cs fájlban adja hozzá WindowsPlatform.bDynamicDebugging = true; a konstruktorhoz:

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

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

Ha játék buildről van szó, a {ProjectName}.Target.cs fájlhoz a WindowsPlatform.bDynamicDebugging = true; elemet a ApplyShared{Project name}TargetSettings() segítségével adja hozzá:

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

Az Unreal Engine célfájljaival kapcsolatos további információkért tekintse meg a Célokat.

C++ dinamikus hibakeresés engedélyezése az Unreal Engine 5.5-ös vagy korábbi verziójához

Az Unreal Engine 5.5-ös vagy korábbi verziójához válassza ki az Unreal Build Tool GitHubról származó módosításait az adattárába.

Megjegyzés:

Az Epic-adattárak GitHubon való eléréséhez epikus fiókra és regisztrált GitHub-fiókra van szükség.

Miután kiválasztotta az adattárra alkalmazandó módosításokat, engedélyezze bDynamicDebugging a korábban ismertetett módon. Az Unreal Engine 5.6-ból származó Unreal Build Acceleratort is használnia kell. Használja az ue5-main legújabb verzióját, vagy tiltsa le az UBA-t az alábbiak hozzáadásával a BuildConfiguration.xml-hoz:

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

Az Unreal Engine felépítésének konfigurálásáról további információt Build Configurationcímű cikkben talál.

Hibaelhárítás

Ha a töréspontok nem érik el a deoptimizált függvényeket:

  • Ha kilép egy [Deoptimized] keretből, előfordulhat, hogy optimalizált kódban van, kivéve ha a hívót egy töréspont miatt deoptimizálták, vagy belelépett a hívóba az aktuális függvény felé vezető úton.

  • Győződjön meg arról, hogy a alt.exe és alt.pdb fájlok létrejönnek. test.exe és test.pdbesetén test.alt.exe és test.alt.pdb ugyanabban a könyvtárban kell lennie. Győződjön meg arról, hogy a megfelelő összeállítási kapcsolók a jelen cikknek megfelelően vannak beállítva.

  • A debug directory bejegyzés létezik test.exe-ben, amelyet a hibakereső a deoptimizált hibakereséshez szükséges alt bináris megtalálására használ. Nyisson meg egy x64 natív Visual Studio-parancssort, és futtassa a link /dump /headers <your executable.exe> annak megtekintéséhez, hogy létezik-e deopt bejegyzés. Egy deopt bejegyzés jelenik meg a Type oszlopban, ahogy a példa utolsó sora is mutatja:

      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
    

    Ha a deopt hibakeresési könyvtárbejegyzés nem található, ellenőrizze, hogy átadja-e a /dynamicdeopt-et a cl.exe-nek, lib.exe-nak és link.exe-nek.

  • A dinamikus deinoptimalizálás nem fog következetesen működni, ha /dynamicdeopt nem kerül továbbításra cl.exe, lib.exeés link.exe-hoz az összes .cpp, .libés bináris fájl számára. Győződjön meg arról, hogy a megfelelő kapcsolók be vannak állítva a projekt létrehozásakor.

További információ az ismert problémákról a következő részben található: C++ dinamikus hibakeresés: Teljes hibakereshetőség optimalizált kiadásokhoz.

Ha a dolgok nem a várt módon működnek, nyisson egy hibajegyet a Fejlesztői Közösség. Adja meg a lehető legtöbb információt a problémáról.

Általános megjegyzések

Az IncrediBuild 10.24 támogatja a C++ dinamikus hibakeresési buildeket.
A FastBuild 1.15-ös verzió támogatja a C++ dinamikus hibakeresési buildeket.

A beágyazott függvények igény szerint deoptimizálódnak. Ha beállít egy töréspontot egy inline-olt függvényre, a hibakereső visszavonja a függvény és annak hívójának optimalizációját. A töréspont a várt helyre kerül, mintha a program fordítóoptimalizálás nélkül lett volna felépítve.

A függvények akkor is inoptimizálva maradnak, ha letiltja a benne lévő töréspontokat. El kell távolítania a függvény töréspontját az optimalizált állapotba való visszatéréshez.

Számos dinamikus hibakeresési töréspontnál két töréspont található: egy az optimalizált binárisban, és egy a nem optimalizált binárisban. Ezért a Töréspontok ablakban több töréspont is látható.

A deoptimalizált verzióhoz használt fordítójelölők megegyeznek az optimalizált verzióhoz használt jelzőkkel, kivéve az optimalizálási jelzőket és a /dynamicdeopt. Ez a viselkedés azt jelenti, hogy a makrók definiálására beállított jelzők és így tovább, a deoptimizált verzióban is be vannak állítva.

A deoptimizált kód nem ugyanaz, mint a hibakeresési kód. A deoptimizált kód az optimalizált verzióval megegyező optimalizálási jelzőkkel van lefordítva, így az assertok és a hibakeresési beállításokra támaszkodó egyéb kód nem kerül bele.

Rendszerintegráció létrehozása

A C++ dinamikus hibakereséshez a fordító és a linker jelzőit meghatározott módon kell beállítani. Az alábbi szakaszok bemutatják, hogyan állíthat be dedikált konfigurációt olyan dinamikus hibakereséshez, amely nem rendelkezik ütköző kapcsolókkal.

Ha a projekt a Visual Studio buildrendszerrel van felépítve, a dinamikus hibakeresési konfiguráció kialakításának jó módja, ha a Configuration Manager használatával klónozza a kiadási vagy hibakeresési konfigurációt, és módosítja a dinamikus hibakeresést. Az alábbi két szakasz ismerteti az eljárásokat.

Új kiadási konfiguráció létrehozása

  1. A Visual Studio főmenüjében válassza a Build>Configuration Manager lehetőséget a Configuration Manager megnyitásához.

  2. Válassza a Konfiguráció legördülő listát, majd válassza az <Új...>lehetőséget.

    A Configuration Managert bemutató képernyőkép.

    A Configuration Managerben a Project-környezetekben a Konfiguráció legördülő lista meg van nyitva, és ki van emelve.

  3. Megnyílik az Új megoldáskonfiguráció párbeszédpanel. A Név mezőben adja meg az új konfiguráció nevét, például ReleaseDD. Győződjön meg arról, hogy a beállítások másolása innét:Kiadás van beállítva. Ezután válassza OK lehetőséget az új konfiguráció létrehozásához.

    Képernyőkép a kiadási build Új projektkonfiguráció párbeszédpaneljáról.

    A Név mező ReleaseDD értékre van állítva. A "Másolási beállítások innen" legördülő menü a Kiadás lehetőségre van beállítva.

  4. Az új konfiguráció megjelenik az Aktív megoldás konfigurációja legördülő listában. Válassza ki , zárja be.

  5. Ha a Configuration legördülő lista a ReleaseDDértékre van beállítva, kattintson a jobb gombbal a projektjére a Megoldáskezelő-ben, és válassza a Tulajdonságoklehetőséget.

  6. A Konfiguráció tulajdonságai>Speciálisbeállításban állítsa a C++ dinamikus hibakeresés használatát igenértékre.

  7. Győződjön meg arról, hogy a teljes programoptimalizálás Nincsértékre van állítva.

    A speciális projekttulajdonságokat bemutató képernyőkép.

    A tulajdonságlap megnyílik a Konfiguráció tulajdonságai > Speciális részre. Használja a C++ dinamikus hibakeresést. A tulajdonság értéke Igen. A teljes programoptimalizálás értéke Nem.

  8. Konfiguráció tulajdonságai>Linker>Optimalizálás, győződjön meg arról, hogy A COMDAT összecsukása engedélyezveNincs (/OPT:NOICF) van beállítva.

    Képernyőkép a Linker optimalizálási projekt tulajdonságairól.

    A tulajdonságlap megnyílik a Konfiguráció tulajdonságok > Linker > Optimalizálás > CMDAT-összecsukás engedélyezése részhez. A tulajdonság értéke Nem (/OPT:NOICF).

Ez a beállítás hozzáadja a /dynamicdeopt kapcsolót a fordítóhoz és a csatolóhoz. A C++ optimalizálási kapcsolók /GL és /OPT:ICF is ki van kapcsolva, így most már létrehozhatja és futtathatja a projektet az új konfigurációban, ha olyan optimalizált kiadási buildet szeretne, amelyet a C++ dinamikus hibakereséssel használhat.

A kiskereskedelmi buildekkel együtt használt egyéb kapcsolókat is hozzáadhat ehhez a konfigurációhoz, így mindig pontosan azokat a kapcsolókat kapcsolhatja be vagy kikapcsolhatja, amelyeket a dinamikus hibakeresés használatakor elvár. A dinamikus hibakereséssel nem használható kapcsolókról további információt Inkompatibilis beállításokcímű témakörben talál.

A Visual Studio konfigurációiról további információt Konfigurációk létrehozása és szerkesztésecímű témakörben talál.

Új hibakeresési konfiguráció létrehozása

Ha hibakeresési bináris fájlokat szeretne használni, de gyorsabban szeretné futtatni őket, módosíthatja a hibakeresési konfigurációt.

  1. A Visual Studio főmenüjében válassza a Build>Configuration Manager lehetőséget a Configuration Manager megnyitásához.

  2. Válassza a Konfiguráció legördülő listát, majd válassza az <Új...>lehetőséget.

    A Configuration Managert bemutató képernyőkép.

    A Configuration Managerben az ablak Project-környezetek részén a Konfiguráció legördülő lista meg van nyitva, és ki van emelve.

  3. Megnyílik az Új projektkonfiguráció párbeszédpanel. A Név mezőben adja meg az új konfiguráció nevét, például DebugDD. Győződjön meg arról, hogy a másolási beállítások forrása:Hibakeresés van beállítva. Ezután válassza OK lehetőséget az új konfiguráció létrehozásához.

    Képernyőkép egy hibakeresési build

    A névmező debugDD értékre van állítva. A "Másolási beállítások innen:" legördülő lista a Debug értékre van állítva.

  4. Az új konfiguráció megjelenik az Aktív megoldás konfigurációja legördülő listában. Válassza ki , zárja be.

  5. Ha a Konfiguráció legördülő listát a DebugDD értékre állította, kattintson a jobb gombbal a projektjére a Solution Explorer-ben, és válassza a Tulajdonságok lehetőséget.

  6. A Konfiguráció tulajdonságai>C/C++>optimalizáláskapcsolja be a kívánt optimalizálásokat. Beállíthatja például, hogy Optimalizálás a Sebesség maximalizálása (/O2).

  7. C/C++>kódgenerálásibeállításban állítsa a alapszintű futtatókörnyezet-ellenőrzéseket az alapértelmezett értékre.

  8. Az C/C++>Általános beállításokban tiltsa le a Csak a Saját Kód Hibakeresésének Támogatása.

  9. Hibakeresési információformátumának beállítása Program Adatbázisra (/Zi).

A hibakeresési buildekkel együtt használt egyéb kapcsolókat is hozzáadhat ehhez a konfigurációhoz, így mindig pontosan azokat a kapcsolókat kapcsolhatja be vagy kikapcsolhatja, amelyeket a dinamikus hibakeresés használatakor elvár. A dinamikus hibakereséssel nem használható kapcsolókról további információt Inkompatibilis beállításokcímű témakörben talál.

A Visual Studio konfigurációiról további információt Konfigurációk létrehozása és szerkesztésecímű témakörben talál.

Egyéni rendszer-felépítési szempontok

Ha egyéni buildrendszerrel rendelkezik, győződjön meg arról, hogy:

  • Adja át /dynamicdeopt-t cl.exe-nek, lib.exe-nek és link.exe-nak.
  • Ne használjon /ZI, ne használja a /RTC jelzőket vagy /JMC.

Buildelosztók esetén:

  • Egy testnevű projekt esetében a fordító test.alt.obj, test.alt.exp, test.objés test.expállít elő. A linker test.alt.exe, test.alt.pdb, test.exeés test.pdbhoz létre .
  • Új eszközkészlet bináris c2dd.dll-at c2.dllmellett kell üzembe helyezni.

Inkompatibilis beállítások

Egyes fordító- és csatolóbeállítások nem kompatibilisek a C++ dinamikus hibakereséssel. Ha a C++ dinamikus hibakeresést a Visual Studio projektbeállításainak használatával kapcsolja be, a program automatikusan kikapcsolja a nem kompatibilis beállításokat, kivéve, ha kifejezetten a további parancssori beállításokat állítja be.

A következő fordítóbeállítások nem kompatibilisek a C++ dinamikus hibakereséssel:

/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

A következő linkerbeállítások nem kompatibilisek a C++ dinamikus hibakereséssel:

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

Lásd még

/dynamicdeopt fordítójelző (előzetes verzió)
/DYNAMICDEOPT linker zászló (előzetes verzió)
C++ dinamikus hibakeresés: Teljes körű hibakeresés optimalizált build-ekhez
Optimalizált kód hibakeresése