Aracılığıyla paylaş


C++ Dinamik Hata Ayıklama (Önizleme)

Önemli

C++ Dinamik Hata Ayıklama şu anda önizleme aşamasındadır. Bu bilgiler, yayından önce önemli ölçüde değiştirilebilen bir ön sürüm özelliğiyle ilgilidir. Microsoft, burada sağlanan bilgilerle ilgili olarak açık veya zımni hiçbir garanti vermez.

Visual Studio 2022 Sürüm 17.14 Önizleme 2 ile başlayan bu önizleme özelliği yalnızca x64 projeleri için geçerlidir.

C++ Dinamik Hata Ayıklama ile iyileştirilmiş kodun hatalarını iyileştirilmemiş gibi ayıklayabilirsiniz. Bu özellik, yüksek kare hızlarına ihtiyaç duyan oyun geliştiricileri gibi iyileştirilmiş kodun performans avantajlarına ihtiyaç duyan geliştiriciler için kullanışlıdır. C++ Dinamik Hata Ayıklama ile iyileştirilmiş derlemelerin performans avantajlarından ödün vermeden iyileştirilmemiş kodun hata ayıklama deneyiminin keyfini çıkarabilirsiniz.

İyileştirilmiş kodda hata ayıklamak zorluklara neden olabilir. Derleyici, kodu iyileştirmek için yönergeleri yeniden konumlandırır ve yeniden düzenler. Sonuç daha verimli bir koddur, ancak şu anlama gelir:

  • İyileştirici yerel değişkenleri kaldırabilir veya hata ayıklayıcı tarafından bilinmeyen konumlara taşıyabilir.
  • İyileştirici kod bloklarını birleştirdiğinde işlevin içindeki kod artık kaynak kodla uyumlu olmayabilir.
  • İyileştirici iki işlevi birleştirirse çağrı yığınındaki işlevlerin işlev adları yanlış olabilir.

Geçmişte geliştiriciler, iyileştirilmiş kodda hata ayıklama sürecindeyken bu sorunlarla ve diğer sorunlarla ilgilendi. C++ Dinamik Hata Ayıklama ile iyileştirilmiş koda, iyileştirilmemiş gibi adım atabilmeniz mümkün olduğundan bu zorluklar ortadan kaldırılmıştır.

İyileştirilmiş ikili dosyaların oluşturulmasına ek olarak, /dynamicdeopt ile derleme, hata ayıklama sırasında kullanılan optimize edilmemiş ikili dosyalar da üretir. Kesme noktası eklediğinizde veya bir işlevin içine (c __forceinline işlevler dahil) adım attığınızda, hata ayıklayıcı iyileştirilmemiş ikiliyi yükler. Ardından iyileştirilmiş kod yerine işlev için iyileştirilmemiş kodun hatalarını ayıklayabilirsiniz. Programın geri kalanında optimize edilmiş kodun performans avantajlarını elde ederken, sanki optimize edilmemiş kodu hata ayıklıyormuşsunuz gibi hata ayıklayabilirsiniz.

C++ Dinamik Hata Ayıklamayı Deneyin

İlk olarak, iyileştirilmiş kodda hata ayıklamanın nasıl bir şey olduğunu gözden geçirelim. Ardından C++ Dinamik Hata Ayıklama'nın işlemi nasıl basitleştirdiğini görebilirsiniz.

  1. Visual Studio'da yeni bir C++ konsol uygulaması projesi oluşturun. ConsoleApplication.cpp dosyasının içeriğini aşağıdaki kodla değiştirin:

    // 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. Çözüm Yapılandırmaları açılan listesini Yayın olarak değiştirin. Çözüm platformu açılan listesinin x64 olarak ayarlandığından emin olun.

  3. Çözümü Derle>Yeniden Derle öğesini seçerek yeniden oluşturun.

  4. int neighbors = countNeighbors(grid, i, j); updateGrid() içinde, 55. satıra bir kesme noktası ayarlayın. Programı çalıştırın.

  5. Kesme noktasına bastığınızda Yereller penceresini görüntüleyin. Ana menüdeWindows>YerelLerinde Hata Ayıkla'yı> seçin. veya değerini ijYerel Ayarlar penceresinde göremezseniz dikkat edin. Derleyici bunları optimize ederek ortadan kaldırmıştır.

  6. cout << (grid[i][j] ? '*' : ' '); printGrid() içinde 19. satırda bir kesme noktası ayarlamayı deneyin. Yapamazsınız. Derleyici kodu iyileştirdiğinden bu davranış beklenir.

Programı durdurun ve C++ Dinamik Hata Ayıklama'yı etkinleştirin ve yeniden deneyin

  1. Çözüm Gezgini'nde projeye sağ tıklayın ve Özellikler'i seçerek proje özellik sayfalarını açın.

  2. Gelişmiş>C++ Dinamik Hata Ayıklama kullan'ı seçin ve ayarı Evet olarak değiştirin.

    Gelişmiş proje özelliklerini gösteren ekran görüntüsü.

    Özellik sayfası, Yapılandırma Özellikleri > Gelişmiş > C++ Dinamik Hata Ayıklama'ya açılır. özelliği Evet olarak ayarlanır.

    Bu adım, /dynamicdeopt anahtarını derleyiciye ve bağlayıcıya ekler. Arka planda, C++ iyileştirme anahtarları /GL ve /OPT:ICF'i de devre dışı bırakır. Bu ayar, komut satırına el ile eklediğiniz anahtarların veya gibi /O1ayarlanmış diğer iyileştirme anahtarlarının üzerine yazmaz.

  3. Çözümü Derle>Yeniden Derle öğesini seçerek yeniden oluşturun. Dinamik hata ayıklama ve tüm program iyileştirmenin uyumsuz olduğunu gösteren derleme tanılama kodu MSB8088 görüntülenir. Bu hata, tüm program iyileştirmenin (/GL) derleme sırasında otomatik olarak kapatıldığı anlamına gelir.

    Proje özelliklerinde tüm program iyileştirmesini el ile kapatabilirsiniz. Yapılandırma Özellikleri>Gelişmiş>Tüm Program İyileştirme'yi seçin ve ayarı Kapalı olarak değiştirin. Şimdi MSB8088 bir uyarı olarak değerlendirilir, ancak Visual Studio'nun gelecekteki bir sürümünde hata olarak ele alınabilir.

  4. Uygulamayı yeniden çalıştırın.

    Artık 55. satırdaki kesme noktasına bastığınızda, i ve j değerlerini YerelLer penceresinde görürsünüz. Çağrı Yığını penceresi, updateGrid()'nin optimize edilmediğini ve dosya adının life.alt.exe olduğunu gösterir. Bu alternatif ikili, iyileştirilmiş kodda hata ayıklamak için kullanılır.

    updateGrid işlevinde hata ayıklamayı gösteren ekran görüntüsü.

    updateGrid işlevinde bir kesme noktası gösterilir. Çağrı yığını, işlevin optimizasyonunun bozulduğunu ve dosya adının life.alt.exeolduğunu gösterir. Locals penceresi i ve j değerlerini ve işlevdeki diğer yerel değişkenleri gösterir.

    İşlev updateGrid() , içinde bir kesme noktası ayarladığınızdan isteğe bağlı olarak devre dışıdır. Hata ayıklama sırasında optimize edilmiş bir işlevin üzerinden geçerseniz, bu işlev deoptimize olmaz. Bir işleve girerseniz, bu işlev deoptimize edilir. Bir işlevin optimizasyon kaybına uğramasının ana yolu, içinde bir kesme noktası ayarlamanız veya işlevin içine adım adım girmenizdir.

    Çağrı Yığını penceresinde bir fonksiyonun optimizasyonunu da kaldırabilirsiniz. İşleve veya seçili bir işlev grubuna sağ tıklayın ve sonraki girişte optimizasyonunu kaldır seçin. Bu özellik, çağrı yığınının başka bir yerinde kesme noktası ayarlamadığınız iyileştirilmiş bir işlevde yerel değişkenleri görüntülemek istediğinizde kullanışlıdır. Bu şekilde dez-optimize edilmiş işlevler Kesme Noktaları penceresinde, Dez-Optimize Edilmiş İşlevler adlı bir kesme noktası grubu olarak gruplandırılır. Kesme noktası grubunu silerseniz, ilişkili işlevler iyileştirilmiş durumlarına geri döner.

Koşullu ve bağımlı kesme noktaları kullanma

  1. 19. satırda, cout << (grid[i][j] ? '*' : ' '); içinde printGrid()kesme noktası ayarlamayı yeniden deneyin. Şimdi işe yarıyor. Fonksiyona bir kesme noktası ayarlamak, fonksiyonun optimize edilmesini azaltarak onu normal şekilde hata ayıklamanızı sağlar.

  2. 19. satırdaki kesme noktasına sağ tıklayın, Koşullar'ı seçin ve koşulu olarak i == 10 && j== 10ayarlayın. Ardından Yalnızca aşağıdaki kesme noktasına isabet edildiğinde etkinleştir: onay kutusunu seçin. Açılan listeden 55. satırdaki kesme noktasını seçin. 19. satırdaki kesme noktası, önce 50. satırdaki kesme noktasına, sonra konsola çıkış yapmak üzere olana grid[10][10] kadar isabet etmez.

    Önemli olan, iyileştirilmiş bir işlevde koşullu ve bağımlı kesme noktaları ayarlayabilir ve iyileştirilmiş bir derlemede hata ayıklayıcının kullanılamayabileceği yerel değişkenleri ve kod satırlarını kullanabilirsiniz.

    19. satır için koşullu kesme noktası ayarlarını gösteren ekran görüntüsü.

    19. satırda koşullu durma noktası gösterilmektedir, cout < < (kılavuz[i][j] ? '*' : ' ');. Koşul i == 10 && j== 10 olarak ayarlanır. Yalnızca aşağıdaki kesme noktasına isabet edildiğinde etkinleştir onay kutusu seçilidir. Kesme noktası açılır listesi, life.cpp dosyasında satır 55'e ayarlanmıştır.

  3. Uygulamayı çalıştırmaya devam edin. 19. satırdaki kesme noktasına ulaşıldığında, 15. satıra sağ tıklayıp Sonraki Deyimi Ayarla'yı seçerek döngünün yeniden çalıştırılmasını sağlayabilirsiniz.

    printGrid işlevinde hata ayıklamayı gösteren ekran görüntüsü.

    19. satırda bir koşullu ve bağımlı duraklama noktası etkinleştirildi, cout < < (ızgara[i][j] ? '*' : ' ');. Locals penceresi i ve j değerlerini ve işlevdeki diğer yerel değişkenleri gösterir. Çağrı Yığını penceresi, işlevin optimizasyonunun geri alındığını ve dosya adının life.alt.exeolduğunu göstermektedir.

  4. Optimizasyon edilmemiş işlevleri, iyileştirilmiş durumlarına döndürmek için tüm kesme noktalarını silin. Visual Studio ana menüsünde Hata Ayıkla>Tüm Kesme Noktalarını Sil'i seçin. Ardından tüm işlevler iyileştirilmiş durumlarına döner.

    Eğer bu kılavuzda yapmadığımız, Çağrı Yığını penceresindeki Bir Sonraki Girişte Deoptimize seçeneği aracılığıyla kesme noktaları eklerseniz, Deoptimize Edilmiş İşlevler grubuna sağ tıklayıp Sil seçeneğini seçerek yalnızca bu gruptaki işlevleri yeniden optimize edilmiş durumlarına döndürebilirsiniz.

    Kesme Noktaları penceresini gösteren ekran görüntüsü.

    Kesme Noktaları penceresi, Deoptimize Edilmiş İşlevler grubunu gösterir. Grup seçilir ve Bağlam menüsü açılır ve Kesme Noktası Grubunu Sil seçili durumdadır.

C++ Dinamik Hata Ayıklamayı kapatma

İyileştirilmiş kodun hata ayıklamasını, kodun yeniden optimize edilmesini engellemeden yapmanız veya iyileştirilmiş koda bir kesme noktası yerleştirmeniz ve kesme noktası geldiğinde kodun optimize halde kalmasını sağlamanız gerekebilir. Bir kesme noktasına ulaştığınızda Dinamik Hata Ayıklamayı kapatmanın veya kodun optimizasyonunu bozulmasını engellemenin birkaç yolu vardır:

  • Visual Studio ana menüsünde Araçlar>Seçenekler>Hata Ayıklama Genel'i> seçin. Mümkün olduğunda hata ayıklanmış işlevlerin optimizasyonunu otomatik olarak kaldır (.NET 8+, C++ Dinamik Hata Ayıklama) onay kutusunu temizleyin. Hata ayıklayıcı bir sonraki başlatışında kod iyileştirilmiş olarak kalır.
  • Birçok dinamik hata ayıklama kesme noktası, iki farklı kesme noktası içerir: biri optimize edilmiş ikili kodda, diğeri ise optimize edilmemiş ikili kodda. Kesme Noktaları penceresinde Sütunları> Gösterİşlevi'ni seçin. İkili dosyayla alt ilişkili kesme noktasını temizleyin. Çiftteki diğer kesme noktası optimize edilmiş kodda kırılır.
  • Hata ayıklarken Visual Studio ana menüsündeWindows>Ayrıştırma> seçin. Odaklandığından emin olun. Disassembly penceresi aracılığıyla bir işlevin içine adım attığınızda, işleve optimizasyon uygulanmaz.
  • dinamik hata ayıklamayı tamamen devre dışı bırakmak için /dynamicdeopt, cl.exe, lib.exe ve link.exe'ye geçirmeyin. Üçüncü taraf kütüphaneleri kullanıyorsanız ve bunları yeniden oluşturamıyorsanız, bu ikili dosya için Dinamik Hata Ayıklama'yı devre dışı bırakmak için son /dynamicdeopt sırasında link.exe ögesini geçirmeyin.
  • Tek bir ikili dosya için Dinamik Hata Ayıklamayı hızla devre dışı bırakmak için (örneğin, test.dll), ikiliyi yeniden adlandırın alt veya silin (örneğin, test.alt.dll).
  • Bir veya daha fazla .cpp dosyası için Dinamik Hata Ayıklama'yı devre dışı bırakmak amacıyla, oluşturma sırasında /dynamicdeopt'i dahil etmeyin. Projenizin geri kalanı Dinamik Hata Ayıklama ile inşa edilmiştir.

Unreal Engine'de C++ Dinamik Hata Ayıklamayı Etkinleştirme

Unreal Engine 5.6, hem Unreal Build Tool hem de Unreal Build Accelerator için C++ Dinamik Hata Ayıklamayı destekler. Etkinleştirmenin iki yolu vardır:

  • Projenizin Target.cs dosyasını içerecek WindowsPlatform.bDynamicDebugging = trueşekilde değiştirin.

  • Geliştirme Düzenleyicisi yapılandırmasını kullanın ve şunları içerecek şekilde değiştirinBuildConfiguration.xml:

    <WindowsPlatform>
        <bDynamicDebugging>true</bDynamicDebugging>
    </WindowsPlatform>
    

Unreal Engine 5.5 veya önceki sürümler için GitHub'dan Unreal Build Tool değişikliklerini deponuza seçip alın. Ardından yukarıda gösterildiği gibi etkinleştirin bDynamicDebugging . Ayrıca, Unreal Engine 5.6'dan Unreal Build Accelerator kullanmanız gerekir. Ya ue5-main'dan en son parçaları kullanın ya da aşağıdakileri BuildConfiguration.xml öğesine ekleyerek UBA'yı devre dışı bırakın.

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

Unreal Engine'in nasıl derlendiğini yapılandırma hakkında daha fazla bilgi için bkz. Derleme Yapılandırması.

Sorun giderme

Kesme noktaları optimize edilmemiş işlevlerde isabet vermezse:

  • Bir [Deoptimized] çerçeveden çıkarsanız, çağıran içinde bir kesme noktası varsa deoptimize edilmiş olmadıkça veya geçerli işlevinize giderken çağıranın içine adım atmadığınız sürece optimize edilmiş bir kodda olabilirsiniz.

  • alt.exe ve alt.pdb dosyalarının derlenmiş olduğundan emin olun. test.exe ve test.pdb için, test.alt.exe ve test.alt.pdb aynı dizinde bulunmalıdır. Doğru derleme anahtarlarının bu makaleye göre ayarlandığından emin olun.

  • debug directory Hata ayıklayıcının, Deoptimize Edilmiş Hata Ayıklama için kullanılacak ikiliyi bulmak üzere kullandığı bir girdi var test.exe. Bir x64-doğal Visual Studio komut istemi açın ve bir link /dump /headers <your executable.exe> girdi olup olmadığını görmek için deopt komutunu çalıştırın. deopt Bu örneğin son satırında gösterildiği gibi sütunda bir girdi görüntülenirType:

      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
    

    Hata ayıklama dizini girdisi deopt yoksa, /dynamicdeopt'yi cl.exe, lib.exe ve link.exe'ye geçirdiğinizi onaylayın.

  • Dinamik Deoptimization, /dynamicdeopt tüm cl.exe, lib.exe ve ikili dosyalar için link.exe, .cpp ve .lib'e geçirilmezse tutarlı bir şekilde çalışmaz. Projenizi oluştururken uygun ayarların yapılmış olduğunu onaylayın.

Bilinen sorunlar hakkında daha fazla bilgi için bkz. C++ Dinamik Hata Ayıklama: İyileştirilmiş Derlemeler için Tam Hata Ayıklama.

İşler beklendiği gibi çalışmıyorsa Geliştirici Topluluğu'nda bir bilet açın. Sorun hakkında mümkün olduğunca çok bilgi ekleyin.

Genel notlar

IncrediBuild 10.24, C++ Dinamik Hata Ayıklama derlemelerini destekler.
FastBuild v1.15, C++ Dinamik Hata Ayıklama derlemelerini destekler.

Çizili işlevler isteğe bağlı olarak kullanımdan kaldırılır. Satır içine alınmış bir işlevde kesme noktası belirlerseniz, hata ayıklayıcı işlevi ve çağıranı deoptimize eder. Kesme noktası, programınız derleyici iyileştirmeleri olmadan oluşturulmuş gibi beklediğiniz noktaya denk gelir.

Bir işlev, içindeki kesme noktalarını devre dışı bıraksanız bile yine de optime edilmez. İşlevin iyileştirilmiş durumuna geri dönmek için kesme noktasını kaldırmanız gerekir.

Birçok dinamik hata ayıklama kesme noktası, iki farklı kesme noktası içerir: biri optimize edilmiş ikili kodda, diğeri ise optimize edilmemiş ikili kodda. Bu nedenle Kesme Noktaları penceresinde birden fazla kesme noktası görürsünüz.

İyileştirilmemiş sürüm için kullanılan derleyici bayrakları, iyileştirilmiş sürüm için kullanılan bayraklarla aynıdır; yalnızca iyileştirme bayrakları ve /dynamicdeopt hariç tutulur. Bu davranış, makroları tanımlamak için ayarladığınız tüm bayrakların deoptimize edilmiş sürümde de ayarlandığı anlamına gelir.

Deoptimize edilmiş kod, hata ayıklama koduyla aynı değildir. Deoptimize edilen kod, iyileştirilmiş sürümle aynı iyileştirme bayraklarıyla derlenir, bu nedenle doğrulamalar ve hata ayıklamaya özgü ayarları kullanan diğer kodlar dahil değildir.

Derleme sistemi tümleştirmesi

C++ Dinamik Hata Ayıklama, derleyici ve bağlayıcı bayraklarının belirli bir şekilde ayarlanmasını gerektirir. Aşağıdaki bölümlerde, çakışan anahtarları olmayan Dinamik Hata Ayıklama için ayrılmış bir yapılandırmanın nasıl ayarlanacağı açıklanmaktadır.

Projeniz Visual Studio derleme sistemiyle oluşturulduysa, Dinamik Hata Ayıklama yapılandırması oluşturmanın iyi bir yolu, Configuration Manager'ı kullanarak Sürüm veya Hata Ayıklama yapılandırmanızı kopyalamak ve Dinamik Hata Ayıklamaya uyum sağlamak için değişiklikler yapmaktır. Aşağıdaki iki bölümde yordamlar açıklanmaktadır.

Yeni Sürüm yapılandırması oluşturma

  1. Visual Studio ana menüsünde Derle>Yapılandırma Yöneticisi'ni seçerek Yapılandırma Yöneticisi'ni açın.

  2. Yapılandırma açılır listesini seçin ve ardından <Yeni...> öğesini seçin.

    Configuration Manager'ın gösterildiği ekran görüntüsü.

    Configuration Manager'da, Proje bağlamları'nın altında Yapılandırma açılan listesi açılır ve vurgulanır.

  3. Yeni Çözüm Yapılandırması iletişim kutusu açılır. Ad alanına yeni yapılandırma için gibi ReleaseDDbir ad girin. Kopyalama ayarlarının Yayın olarak ayarlandığından emin olun: Ardından tamam'ı seçerek yeni yapılandırmayı oluşturun.

    Çıktı derlemesi için Yeni Proje Yapılandırması iletişim kutusunu gösteren bir ekran görüntüsü.

    Ad alanı ReleaseDD olarak ayarlanır. 'Ayarları şuradan kopyala' açılır listesi Yayın üzerine ayarlanmıştır.

  4. Yeni yapılandırma Etkin çözüm yapılandırması açılan listesinde görünür. Kapat'ıseçin.

  5. Yapılandırma açılan listesi ReleaseDD olarak ayarlandığında, Çözüm Gezgini'nde projenize sağ tıklayın ve Özellikler'i seçin.

  6. Yapılandırma Özellikleri>Gelişmiş bölümünde C++ Dinamik Hata Ayıklama kullan'ıEvet olarak ayarlayın.

  7. Tüm Program İyileştirme'ninHayır olarak ayarlandığından emin olun.

    Gelişmiş proje özelliklerini gösteren ekran görüntüsü.

    Özellik sayfası, Gelişmiş > Yapılandırma Özellikleri'ne açılır. C++ Dinamik Hata Ayıklamayı kullanın. özelliği Evet olarak ayarlanır. Tüm Program İyileştirmesi Hayır olarak ayarlanır.

  8. Yapılandırma Özellikleri>Bağlayıcı>İyileştirmesi'ndeCOMDAT katlama özelliğini etkinleştir seçeneğinin Hayır (/OPT:NOICF) olarak ayarlandığından emin olun.

    Bağlayıcı iyileştirme projesi özelliklerini gösteren ekran görüntüsü.

    Özellik sayfası, Yapılandırma Özellikleri > Bağlayıcı > İyileştirme > CMDAT Katlamayı Etkinleştir olarak açılır. özelliği Hayır (/OPT:NOICF) olarak ayarlanır.

Bu ayar, /dynamicdeopt anahtarını derleyiciye ve bağlayıcıya ekler. C++ iyileştirme anahtarları /GL ve /OPT:ICF ayrıca kapalıyken artık C++ Dinamik Hata Ayıklama ile kullanabileceğiniz iyileştirilmiş bir sürüm derlemesi istediğinizde projenizi yeni yapılandırmada derleyebilir ve çalıştırabilirsiniz.

Perakende derlemelerinizle birlikte kullandığınız diğer anahtarları, Dinamik Hata Ayıklama kullanırken beklediğiniz gibi anahtarların her zaman tam olarak açık veya kapalı olmasını sağlamak için bu yapılandırmaya ekleyebilirsiniz. Dinamik Hata Ayıklama ile kullanmamanız gereken anahtarlar hakkında daha fazla bilgi için bkz. Uyumsuz seçenekler.

Visual Studio'daki yapılandırmalar hakkında daha fazla bilgi için bkz. Yapılandırmaları oluşturma ve düzenleme.

Yeni hata ayıklama yapılandırması oluşturma

Hata ayıklama ikili dosyalarını kullanmak ancak bunların daha hızlı çalışmasını istiyorsanız, Hata ayıklama yapılandırmanızı değiştirebilirsiniz.

  1. Visual Studio ana menüsünde Derle>Yapılandırma Yöneticisi'ni seçerek Yapılandırma Yöneticisi'ni açın.

  2. Yapılandırma açılır listesini seçin ve ardından <Yeni...> öğesini seçin.

    Configuration Manager'ın gösterildiği ekran görüntüsü.

    Configuration Manager'da, pencerenin Proje bağlamları bölümünde Yapılandırma açılan listesi görünür ve vurgulanır.

  3. Yeni Proje Yapılandırması iletişim kutusu açılır. Ad alanına yeni yapılandırma için DebugDD gibi bir ad girin. Kopyala ayarlarını şundan:Debug olarak ayarlandığından emin olun. Ardından tamam'ı seçerek yeni yapılandırmayı oluşturun.

    Hata ayıklama derlemesi için 'Yeni Proje Yapılandırması iletişim kutusunu' gösteren ekran görüntüsü.

    Ad alanı DebugDD olarak ayarlanır. Kopya ayarları şu kaynaktan: açılan listesi Debug olarak ayarlanır.

  4. Yeni yapılandırma Etkin çözüm yapılandırması açılan listesinde görünür. Kapat'ıseçin.

  5. Yapılandırma açılan listesi DebugDD olarak ayarlandığında, Çözüm Gezgini'nde projenize sağ tıklayın ve Özellikler'i seçin.

  6. Yapılandırma Özellikleri>C/C++>İyileştirme'de istediğiniz iyileştirmeleri açın. Örneğin, İyileştirme'yiMaksimum Hız (/O2) olarak ayarlayabilirsiniz.

  7. C/C++>Kod Oluşturma'daTemel Çalışma Zamanı Denetimleri'yiVarsayılan olarak ayarlayın.

  8. C/C++>Genel'deYalnızca Kod Hata Ayıklamamı Destekle seçeneğini devre dışı bırakın.

  9. Hata Ayıklama Bilgileri BiçiminiProgram Veritabanı (/Zi) olarak ayarlayın.

Dinamik Hata Ayıklama kullanırken beklediğiniz anahtarların her zaman tam olarak açık veya kapalı olması için bu yapılandırmaya hata ayıklama derlemelerinizle birlikte kullandığınız başka anahtarlar ekleyebilirsiniz. Dinamik Hata Ayıklama ile kullanmamanız gereken anahtarlar hakkında daha fazla bilgi için bkz. Uyumsuz seçenekler.

Visual Studio'daki yapılandırmalar hakkında daha fazla bilgi için bkz. Yapılandırmaları oluşturma ve düzenleme.

Özel derleme sistemiyle ilgili dikkat edilmesi gerekenler

Özel bir derleme sisteminiz varsa şunları yaptığınızdan emin olun:

  • /dynamicdeopt öğesini cl.exe, lib.exe ve link.exe öğelerine geçirin.
  • /ZI, /RTC bayraklarından herhangi birini ya da /JMC kullanmayın.

Derleme dağıtımcıları için:

  • test adlı bir proje için derleyici test.alt.obj, test.alt.exp, test.obj ve test.exp oluşturur. Bağlayıcı test.alt.exe, test.alt.pdb, test.exe ve test.pdb oluşturur.
  • Yeni araç takımı ikili c2dd.dll dosyasını c2.dll ile birlikte dağıtmanız gerekir.

Uyumsuz seçenekler

Bazı derleyici ve bağlayıcı seçenekleri C++ Dinamik Hata Ayıklama ile uyumsuz. Visual Studio proje ayarlarını kullanarak C++ Dinamik Hata Ayıklama'yı açarsanız, uyumsuz seçenekler, bunları ek komut satırı seçenekleri ayarında özellikle ayarlamadığınız sürece otomatik olarak kapatılır.

Aşağıdaki derleyici seçenekleri C++ Dinamik Hata Ayıklama ile uyumsuz:

/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şağıdaki bağlayıcı seçenekleri C++ Dinamik Hata Ayıklama ile uyumsuz:

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

Ayrıca bakınız

/dynamicdeopt derleyici bayrağı (önizleme)
/DYNAMICDEOPT bağlayıcı bayrağı (önizleme)
C++ Dinamik Hata Ayıklama: İyileştirilmiş Derlemeler için Tam Hata Ayıklama Kapasitesi
İyileştirilmiş kodda hata ayıklama