Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
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; }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.
Az újraépítéshez válassza a Build>Rebuild Solutionlehetőséget.
Állítson be egy töréspontot az 55. sorban,
int neighbors = countNeighbors(grid, i, j);updateGrid(). Futtassa a programot.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
ivagyjértéke nem látható a Helyiek ablakban. A fordító optimalizálás során eltávolította őket.Próbálja meg beállítani a töréspontot a 19. sorban,
cout << (grid[i][j] ? '*' : ' ');aprintGrid()-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
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.
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 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
/dynamicdeoptkapcsoló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.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
MSB8088figyelmeztetésként lesz kezelve, de előfordulhat, hogy a Visual Studio egy későbbi verziójában hibaként kezelik.Futtassa újra az alkalmazást.
Amikor eléri az 55. sorban a töréspontot, a
iésjértékei a Helyiek ablakban láthatók. A Hívásverem ablakban látható, hogy aupdateGrid()deoptimizált, a fájlnév pediglife.alt.exe. Ez a másodlagos bináris az optimalizált kód hibakeresésére szolgál.
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
Próbálja meg ismét beállítani a töréspontot a 19. sorban,
cout << (grid[i][j] ? '*' : ' ');-ban ésprintGrid()-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.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 amikorgrid[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 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.
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 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.
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 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
altbiná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 acl.exe,lib.exeéslink.execímkének. Ha külső könyvtárakat használ, és nem tudja újraépíteni őket, ne adja át a/dynamicdeoptjelölőt az utolsólink.exesorá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 aaltbináris fájlt (példáultest.alt.dll). - Ha egy vagy több
.cppfájl dinamikus hibakeresését szeretné letiltani, ne adjon át/dynamicdeopta 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.
A
BuildConfiguration.xmlfá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.txtKeressen rá a
Log.txtkövetkezőreBuildConfiguration.xml: . Olyan sort kell tartalmaznia, mintReading configuration file from: C:\LyraStarterGame\Saved\UnrealBuildTool\BuildConfiguration.xmlMódosítsa úgy a
BuildConfiguration.xmlfá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ésalt.pdbfájlok létrejönnek.test.exeéstest.pdbeseténtest.alt.exeéstest.alt.pdbugyanabban 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 directorybejegyzés léteziktest.exe-ben, amelyet a hibakereső a deoptimizált hibakereséshez szükségesaltbináris megtalálására használ. Nyisson meg egy x64 natív Visual Studio-parancssort, és futtassa alink /dump /headers <your executable.exe>annak megtekintéséhez, hogy létezik-edeoptbejegyzés. Egydeoptbejegyzés jelenik meg aTypeoszlopban, 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.exeHa a
deopthibakeresési könyvtárbejegyzés nem található, ellenőrizze, hogy átadja-e a/dynamicdeopt-et acl.exe-nek,lib.exe-nak éslink.exe-nek.A dinamikus deinoptimalizálás nem fog következetesen működni, ha
/dynamicdeoptnem kerül továbbításracl.exe,lib.exeéslink.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
A Visual Studio főmenüjében válassza a Build>Configuration Manager lehetőséget a Configuration Manager megnyitásához.
Válassza a Konfiguráció legördülő listát, majd válassza az <Új...>lehetőséget.
A Configuration Managerben a Project-környezetekben a Konfiguráció legördülő lista meg van nyitva, és
ki van emelve. 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.
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.
Az új konfiguráció megjelenik az Aktív megoldás konfigurációja legördülő listában. Válassza ki , zárja be.
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.
A Konfiguráció tulajdonságai>Speciálisbeállításban állítsa a C++ dinamikus hibakeresés használatát igenértékre.
Győződjön meg arról, hogy a teljes programoptimalizálás Nincsértékre van állítva.
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.
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.
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.
A Visual Studio főmenüjében válassza a Build>Configuration Manager lehetőséget a Configuration Manager megnyitásához.
Válassza a Konfiguráció legördülő listát, majd válassza az <Új...>lehetőséget.
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. 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.
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.
Az új konfiguráció megjelenik az Aktív megoldás konfigurációja legördülő listában. Válassza ki , zárja be.
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.
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).
C/C++>kódgenerálásibeállításban állítsa a alapszintű futtatókörnyezet-ellenőrzéseket az alapértelmezett értékre.
Az C/C++>Általános beállításokban tiltsa le a Csak a Saját Kód Hibakeresésének Támogatása.
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-tcl.exe-nek,lib.exe-nek éslink.exe-nak. - Ne használjon
/ZI, ne használja a/RTCjelzőket vagy/JMC.
Buildelosztók esetén:
- Egy
testnevű projekt esetében a fordítótest.alt.obj,test.alt.exp,test.objéstest.expállít elő. A linkertest.alt.exe,test.alt.pdb,test.exeéstest.pdbhoz létre . - Új eszközkészlet bináris
c2dd.dll-atc2.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