Microsoft C++ Derleme Araçları veya belgeleriyle ilgili bir sorunu bildirme

Microsoft C++ derleyicisinde (MSVC), bağlayıcıda veya diğer araçlarda ve kitaplıklarda sorunlarla karşılaşırsanız, bunları öğrenmek istiyoruz. Sorun belgelerimizde olduğunda, bunu da bilmek istiyoruz.

C++ araç takımı sorununu bildirme

Bir sorunu bize bildirmenin en iyi yolu, keşfettiğiniz sorunun açıklamasını içeren bir rapor göndermektir. Programınızı nasıl oluşturduğunuzla ilgili tüm ayrıntılara sahip olmalıdır. Ve ayrıca, sorunu kendi makinelerimizde yeniden üretmek için kullanabileceğimiz eksiksiz bir test senaryosu olan bir yeniden üretim örneği içermelidir. Bu bilgiler, sorunun kodumuzda var olduğunu ve ortamınızda yerel olmadığını hızla doğrulamamıza olanak tanır. Derleyicinin diğer sürümlerini etkileyip etkilemediğini belirlememize ve nedenini tanılamamıza yardımcı olur.

Aşağıdaki bölümlerde, iyi bir raporun ne olduğu hakkında bilgi edinin. Bulduğunuz türdeki bir sorun için yeniden oluşturma adımlarını nasıl hazırlayacağınızı ve raporunuzu ürün ekibine nasıl göndereceğinizi açıklıyoruz. Raporlarınız bizim ve sizin gibi diğer geliştiriciler için önemlidir. Microsoft C++ geliştirmemize yardımcı olduğunuz için teşekkür ederiz!

Raporunuzu hazırlama

Bulduğunuz sorunu tam bilgi olmadan yeniden oluşturmak zor olduğundan, yüksek kaliteli bir rapor oluşturmak önemlidir. Raporunuz ne kadar iyi olursa sorunu o kadar etkili bir şekilde yeniden oluşturabilir ve tanılayabiliriz.

En azından raporunuz şunları içermelidir:

  • Kullanmakta olduğunuz araç takımının tam sürüm bilgileri.

  • Kodunuzu oluşturmak için kullanılan tam cl.exe komut satırı.

  • Bulduğunuz sorunun ayrıntılı açıklaması.

  • Bir yeniden üretim örneği: sorunu gösteren eksiksiz, basitleştirilmiş, kendi kendine yeterli bir kaynak kodu örneği.

İhtiyacımız olan belirli bilgiler ve bunları nerede bulabileceğiniz ve iyi bir yeniden oluşturma hakkında daha fazla bilgi edinmek için okumaya devam edin.

Araç seti sürümü

Soruna neden olan araç takımının tam sürüm bilgilerine ve hedef mimarisine ihtiyacımız var. Bunu, yeniden oluşturma adımlarınızı kendi makinelerimizde aynı araç takımıyla test edebilmemiz için istiyoruz. Sorunu yeniden oluşturabiliyorsak, bu bilgiler araç takımının diğer hangi sürümlerinin aynı sorunla karşılaşabileceğini araştırmak için bir başlangıç noktası da sağlar.

Derleyicinizin tam sürümünü raporlamak için

  1. Projenizi derlemek için kullanılan Visual Studio sürümü ve yapılandırma mimarisiyle eşleşen Geliştirici Komut İstemi'ni açın. Örneğin, x64 hedefleri için x64 üzerinde Visual Studio 2017 kullanarak derleme yapıyorsanız VS 2017 için x64 Yerel Araçlar Komut İstemi'ni seçin. Daha fazla bilgi için bkz . Geliştirici komut istemi kısayolları.

  2. Geliştirici komut istemi konsol penceresinde cl /Bv komutunu girin.

Çıkış şuna benzer görünmelidir:

C:\Users\username\Source>cl /Bv
Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26428.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

Compiler Passes:
 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\cl.exe:        Version 19.14.26428.1
 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\c1.dll:        Version 19.14.26428.1
 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\c1xx.dll:      Version 19.14.26428.1
 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\c2.dll:        Version 19.14.26428.1
 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\link.exe:      Version 14.14.26428.1
 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\mspdb140.dll:  Version 14.14.26428.1
 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\1033\clui.dll: Version 19.14.26428.1

cl : Command line error D8003 : missing source filename

Çıktının tamamını kopyalayıp raporunuz içine yapıştırın.

Komut satırı

Kodunuzu derlemek için kullanılan cl.exe ve tüm bağımsız değişkenleriyle birlikte tam komut satırına ihtiyacımız var. Bu sayede makinelerimizin üzerinde de aynı şekilde oluşturabiliriz. Bu önemlidir, çünkü bulduğunuz sorun yalnızca belirli bir parametreyle veya parametre kombinasyonuyla derleme sırasında ortaya çıkabilir.

Bu bilgileri bulabileceğiniz en iyi yer, sorunu yaşadıktan hemen sonraki derleme günlüğüdür. Komut satırının, soruna yol açabilecek argümanları tam olarak aynı şekilde içermesini sağlar.

Komut satırının içeriğini raporlamak için

  1. CL.command.1.tlog dosyasını bulun ve açın. Varsayılan olarak, bu dosya Belgeler klasörünüzdeki \Visual Studio version\Projects\SolutionName\ProjectName\Configuration\ProjectName.tlog\CL.command.1.tlog konumunda ya da Kullanıcı klasörünüz altında \Source\Repos\SolutionName\ProjectName\Configuration\ProjectName.tlog\CL.command.1.tlog konumunda bulunur. Başka bir derleme sistemi kullanıyorsanız veya projeniz için varsayılan konumu değiştirdiyseniz farklı bir konumda olabilir.

    Bu dosyanın içinde, kaynak kod dosyalarınızın adlarını ve bunları derlemek için kullanılan komut satırı argümanlarını, her biri ayrı bir satırda olacak şekilde bulacaksınız.

  2. Sorunun oluştuğu kaynak kod dosyasının adını içeren satırı bulun. Bunun altındaki satır, karşılık gelen cl.exe komut bağımsız değişkenlerini içerir.

Komut satırının tamamını kopyalayıp raporunuz içine yapıştırın.

Sorunun açıklaması

Bulduğunuz sorunun ayrıntılı bir açıklamasına ihtiyacımız var. Bu sayede makinelerimizde de aynı etkiyi gördüğümüzi doğrulayabiliriz. Ayrıca bazen neyi başarmaya çalıştığınızı ve ne olmasını beklediğinizi bilmek de yararlı olabilir.

İyi bir açıklama, araç setinin verdiği tam hata iletilerini veya gördüğünüz tam çalışma zamanındaki davranışı içerir. Sorunu doğru şekilde yeniden oluşturduğumuzu doğrulamak için bu bilgilere ihtiyacımız var. Yalnızca son hata iletisini değil tüm derleyici çıkışını ekleyin. Bildirdiğiniz soruna yol açan her şeyi görmemiz gerekiyor. Komut satırı derleyicisini kullanarak sorunu çoğaltabiliyorsanız, bu derleyici çıktısı tercih edilir. IDE ve diğer derleme sistemleri, gördüğünüz hata iletilerini filtreleyip yalnızca hata iletisinin ilk satırını yakalayabilir.

Sorun, derleyicinin geçersiz kod kabul etmemesi ve tanılama oluşturmamasıysa, bunu raporunuzda ekleyin.

Çalışma zamanı davranışı sorununu bildirmek için, programın yazdırdığınız şeyin ve görmeyi beklediğiniz şeyin tam bir kopyasını ekleyin. İdeal olarak, bunu doğrudan çıktı ifadesinin içine yerleştirin; örneğin, printf("This should be 5: %d\n", actual_result);. Programınız kilitleniyor veya yanıt vermiyorsa, bundan da bahsedin.

Bulduğunuz sorunu tanılamamıza yardımcı olabilecek diğer ayrıntıları (bulduğunuz geçici çalışmalar gibi) ekleyin. Raporunuzun başka bir yerinde bulunan bilgileri yinelememeye çalışın.

Yeniden oluşturma

Yeniden oluşturma, tam, kendi içinde yer alan bir kaynak kodu örneğidir. Bulduğunuz sorunu tekrarlanabilir biçimde gösterir; adı da buradan gelir. Hatayı makinelerimizde yeniden üretebilmemiz için buna yönelik bir senaryoya ihtiyacımız var. Kod, derlenen ve çalışan temel bir yürütülebilir dosya oluşturmak için tek başına yeterli olmalıdır. Veya, bulduğunuz sorun olmasaydı bu derlenir ve çalışırdı. Yeniden üretim örneği, bir kod parçacığı değildir. Tam işlevlere ve sınıflara sahip olmalı ve standart üst bilgiler için bile gerekli tüm #include yönergelerini içermelidir.

İyi bir tekrar oluşturmayı ne belirler

İyi bir yeniden üretim örneği:

  • En az. Yeniden oluşturma işlemleri mümkün olduğunca küçük olmalıdır ancak yine de tam olarak bulduğunuz sorunu gösterir. Yeniden oluşturmaların karmaşık veya gerçekçi olması gerekmez. Yalnızca Standart'a veya belgelenmiş derleyici uygulamasına uygun kodu göstermeleri gerekir. Eksik tanılama için, repro'nuz uyumlu olmayan kodu göstermelidir. Basit, kısa ve net, sorunu göstermeye yetecek kadar kod içeren örnekler en iyisidir. Kodu kaldırabiliyor veya basitleştirebiliyor, uyumluluğu koruyor ve sorunu olduğu gibi bırakabiliyorsanız, öyle yapın. Çalışan kodlara karşı örnekler eklemeniz gerekmez.

  • Kendi Kendine Yeten. Yeniden oluşturmalar gereksiz bağımlılıklardan kaçınmalıdır. Sorunu üçüncü taraf kitaplıklar olmadan yeniden oluşturabiliyorsanız, bunu yapın. Basit çıkış deyimlerinin (örneğin, puts("this shouldn't compile");, std::cout << value;ve printf("%d\n", value);) yanı sıra herhangi bir kitaplık kodu olmadan sorunu yeniden oluşturabilirseniz, bunu yapın. Örnek, herhangi bir kullanıcı üst bilgisine başvurmadan tek bir kaynak kodu dosyasına daraltılabilirse idealdir. Soruna olası bir katkıda bulunan olarak düşünmemiz gereken kod miktarını azaltmak bizim için çok yararlı olur.

  • En son derleyici sürümüne karşı. Yeniden oluşturmalar mümkün olduğunda araç takımının en son sürümüne yönelik en son güncelleştirmeyi kullanmalıdır. Alternatif olarak, sonraki güncelleştirmenin veya sonraki ana sürümün en son yayın öncesi sürümünü de kullanabilirsiniz. Araç takımının eski sürümlerinde bulabileceğiniz sorunlar genellikle daha yeni sürümlerde düzeltilir. Düzeltmeler yalnızca istisnai durumlarda eski sürümlere geri aktarılır.

  • uygunsa diğer derleyicilere karşı denetlendi. Taşınabilir C++ kodu içeren yeniden oluşturmalar, mümkünse diğer derleyicilere karşı davranışı doğrulamalıdır. C++ standardı sonuçta program doğruluğunu belirler ve hiçbir derleyici mükemmel değildir. Ancak Clang ve GCC kodunuzu tanılama olmadan kabul ettiğinde ve MSVC kabul etmediğinde büyük olasılıkla derleyicimizde bir hata buldunuz. (Diğer olasılıklar Unix ve Windows davranışındaki farkları veya farklı C++ standartları uygulama düzeylerini vb.) içerir. Tüm derleyiciler kodunuzu reddettiği zaman büyük olasılıkla kodunuz yanlıştır. Farklı hata iletileri görmek sorunu kendiniz tanılamanıza yardımcı olabilir.

    Iso C++ web sitesindeki Çevrimiçi C++ derleyicilerinde kodunuzu test etmek için çevrimiçi derleyicilerin listesini veya GitHub'daki bu çevrimiçi C++ Derleyicileri Listesini bulabilirsiniz. Bazı özel örnekler Wandbox ve Derleyici Gezgini'dir.

    Not

    Çevrimiçi derleyici web siteleri Microsoft'a bağlı değildir. Birçok çevrimiçi derleyici web sitesi kişisel projeler olarak çalıştırılır. Bu sitelerden bazıları, bunu okuduğunuzda kullanılamayabilir, ancak bir aramada kullanabileceğiniz başka siteler bulunmalıdır.

Derleyicideki, bağlayıcıdaki ve kitaplıklardaki sorunlar kendilerini belirli şekillerde gösterme eğilimindedir. Karşılaştığınız sorunun türü, raporunuza hangi yeniden oluşturma adımlarını eklemeniz gerektiğini belirler. Uygun bir repro olmadan, araştıracak bir şeyimiz yok. Burada, karşılaşabileceğiniz sorunlardan birkaçı yer alır. Her sorun türünü bildirmek için kullanmanız gereken yeniden üretim örneğinin nasıl oluşturulacağına ilişkin talimatları ekliyoruz.

Frontend (ayrıştırıcı) çökmesi

Ön uç çökmeleri, derleyicinin ayrıştırma aşamasında meydana gelir. Genellikle, derleyici Önemli Hata C1001 yayar ve hatanın oluştuğu kaynak kod dosyasına ve satır numarasına başvurur. Genellikle msc1.cpp adlı bir dosyadan bahseder, ancak bu ayrıntıyı yoksayabilirsiniz.

Bu tür bir kilitlenme için bir önceden işlenmiş yeniden oluşturma örneği sağlayın.

İşte bu tür bir kilitlenme için örnek derleyici çıktısı şöyledir:

SandBoxHost.cpp
d:\o\dev\search\foundation\common\tools\sandbox\managed\managed.h(929):
        fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'msc1.cpp', line 1369)
To work around this problem, try simplifying or changing the program near the
        locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
d:\o\dev\search\foundation\common\tools\sandbox\managed\managed.h(929):
        note: This diagnostic occurred in the compiler generated function
        'void Microsoft::Ceres::Common::Tools::Sandbox::SandBoxedProcess::Dispose(bool)'
Internal Compiler Error in d:\o\dev\otools\bin\x64\cl.exe.  You will be prompted
        to send an error report to Microsoft later.
INTERNAL COMPILER ERROR in 'd:\o\dev\otools\bin\x64\cl.exe'
    Please choose the Technical Support command on the Visual C++
    Help menu, or open the Technical Support help file for more information

Arka uç (kod oluşturma) çökmesi

Arka uç çökmeleri, derleyicinin kod oluşturma aşamasında meydana gelir. Genellikle derleyici Ölümcül Hata C1001 oluşturur ve sorunla ilişkili kaynak kod dosyasını ve satır numarasını belirtmeyebilir. Sık sık compiler\utc\src\p2\main.c dosyasından söz edilir, ancak bu ayrıntıyı yok sayabilirsiniz.

Bu tür bir kilitlenme için, cl.exe’ye verilen /GL komut satırı bağımsız değişkeniyle etkinleştirilen Bağlantı Zamanı Kodu Oluşturma (LTCG) kullanıyorsanız bir Link repro sağlayın. Aksi takdirde, bunun yerine ön işlenmiş bir yeniden üretim sağlayın.

Aşağıda, LTCG'nin kullanılmadığı bir arka uç çökmesine ilişkin örnek derleyici çıktısı verilmiştir. Derleyici çıktınız aşağıdaki gibi görünüyorsa, ön işlenmiş yeniden üretim örneği sunmanız gerekir.

repro.cpp
\\officefile\public\tadg\vc14\comperror\repro.cpp(13) : fatal error C1001:
        An internal error has occurred in the compiler.
(compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 230)
To work around this problem, try simplifying or changing the program near the
        locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
INTERNAL COMPILER ERROR in
        'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.exe'
    Please choose the Technical Support command on the Visual C++
    Help menu, or open the Technical Support help file for more information

İç DERLEYICI HATASI ile başlayan satırda cl.exe yerine link.exe belirtiliyorsa LTCG etkinleştirilmiştir. Bu durumda bir Bağlantı yeniden oluşturma sağlayın. LTCG’nin etkinleştirilip etkinleştirilmediği derleyicinin hata iletisinden açıkça anlaşılmıyorsa komut satırı bağımsız değişkenlerini inceleyin. Bunları, önceki bir adımda /GL komut satırı bağımsız değişkeni için derleme günlüğünüzden kopyaladınız.

Bağlayıcının çökmesi

Bağlayıcı kilitlenmeleri, derleyici çalıştıktan sonra bağlantı aşamasında meydana gelir. Bağlayıcı genellikle Bağlayıcı Araçları Hatası LNK1000 gösterir.

Not

Çıktı C1001'den söz ediyorsa veya Bağlantı Zamanında Kod Oluşturma içeriyorsa, onun yerine Arka uç (kod oluşturma) çökmesi bölümüne bakın.

Bu tür bir kilitlenme için bir Bağlantı yeniden oluşturma sağlayın.

İşte bu tür bir kilitlenmeye ait derleyici çıktısının bir örneği:

z:\foo.obj : error LNK1000: Internal error during IMAGE::Pass2

  Version 14.00.22816.0

  ExceptionCode            = C0000005
  ExceptionFlags           = 00000000
  ExceptionAddress         = 00007FF73C9ED0E6 (00007FF73C9E0000)
        "z:\tools\bin\x64\link.exe"
  NumberParameters         = 00000002
  ExceptionInformation[ 0] = 0000000000000000
  ExceptionInformation[ 1] = FFFFFFFFFFFFFFFF

CONTEXT:

  Rax    = 0000000000000400  R8     = 0000000000000000
  Rbx    = 000000655DF82580  R9     = 00007FF840D2E490
  Rcx    = 005C006B006F006F  R10    = 000000655F97E690
  Rdx    = 000000655F97E270  R11    = 0000000000000400
  Rsp    = 000000655F97E248  R12    = 0000000000000000
  Rbp    = 000000655F97EFB0  E13    = 0000000000000000
  Rsi    = 000000655DF82580  R14    = 000000655F97F390
  Rdi    = 0000000000000000  R15    = 0000000000000000
  Rip    = 00007FF73C9ED0E6  EFlags = 0000000000010206
  SegCs  = 0000000000000033  SegDs  = 000000000000002B
  SegSs  = 000000000000002B  SegEs  = 000000000000002B
  SegFs  = 0000000000000053  SegGs  = 000000000000002B
  Dr0    = 0000000000000000  Dr3    = 0000000000000000
  Dr1    = 0000000000000000  Dr6    = 0000000000000000
  Dr2    = 0000000000000000  Dr7    = 0000000000000000

Artımlı bağlantı etkinleştirildiyse ve kilitlenme yalnızca başarılı bir ilk bağlantıdan sonra oluştuysa, yani daha sonraki bir artımlı bağlantının temel aldığı ilk tam bağlantıdan sonra, ilk bağlantı tamamlandıktan sonra değiştirilen kaynak dosyalara karşılık gelen nesne (.obj) ve kitaplık (.lib) dosyalarının bir kopyasını da sağlayın.

Hatalı kod oluşturma

Hatalı kod oluşturma nadirdir. Derleyici yanlışlıkla uygulamanızın çalışma zamanında kilitlenmesine neden olan yanlış kod oluşturduğunda oluşur. Bunun yerine, doğru kodu oluşturmalı veya derleme zamanında bir sorun algılamalıdır. Bulduğunuz sorunun hatalı kod oluşturmayla sonuçlanacağına inanıyorsanız, raporunuzu Arka uç (kod oluşturma) kilitlenmesi ile aynı şekilde değerlendirin.

Bu tür bir kilitlenme için cl.exe için /GL komut satırı bağımsız değişkenini kullanıyorsanız bir Bağlantı yeniden oluşturması sağlayın. Değilse, ön işlenmiş yeniden üretim sağlayın.

Bir yeniden üretim nasıl oluşturulur

Sorunun kaynağını bulmamıza yardımcı olmak için iyi bir yeniden oluşturma çok önemlidir. Belirli tür yeniden oluşturmalar için aşağıda açıklanan adımlardan herhangi birini yapmadan önce, sorunu gösteren kodu mümkün olduğunca daraltmaya çalışın. Bağımlılıkları, gerekli üst bilgileri ve kitaplıkları ortadan kaldırmayı veya en aza indirmeyi deneyin. Mümkünse kullanılan derleyici seçeneklerini ve önişlemci tanımlarını sınırlayın.

Aşağıda, farklı türlerdeki sorunları bildirmek için kullanılacak çeşitli türlerde yeniden oluşturma yönergeleri yer almaktadır.

Önceden işlenmiş yeniden üretimler

Ön işlenmiş yeniden üretim, bir sorunu gösteren tek bir kaynak dosyasıdır. C ön işlemcisinin çıkışından oluşturulur. Bir tane oluşturmak için özgün yeniden oluşturma kaynak dosyasında /P derleyicisi seçeneğini kullanın. Bu seçenek, diğer kaynak ve üst bilgi dosyalarındaki bağımlılıkları kaldırmak için eklenen üst bilgileri satır içi olarak gösterir. Seçeneği ayrıca makroları, #ifdef koşulluları ve yerel ortamınıza bağlı olabilecek diğer önişlemci komutlarını çözer.

Not

Önceden işlenmiş yeniden üretimler, standart kitaplık uygulamamızdaki hatalardan kaynaklanabilecek sorunlar için o kadar kullanışlı değildir; çünkü sorunu zaten düzeltmiş olup olmadığımızı görmek için çoğu zaman en son, hâlen geliştirilmekte olan uygulamamızı onun yerine kullanmak isteriz. Bu durumda, repro’yu ön işlemden geçirmeyin; sorunu tek bir kaynak dosyasına indirgeyemiyorsanız kodunuzu bir .zip dosyası ya da benzeri bir arşiv içinde paketleyin veya IDE projesi olarak hazırlanmış bir repro kullanmayı değerlendirin. Daha fazla bilgi için bkz.: Diğer yeniden oluşturma örnekleri.

Kaynak kod dosyasını önceden işlemek için

  1. Komut satırının içeriğini bildirme bölümünde açıklandığı gibi, yeniden oluşturma senaryonuzu derlemek için kullanılan komut satırı bağımsız değişkenlerini kaydedin.

  2. Projenizi derlemek için kullanılan Visual Studio sürümü ve yapılandırma mimarisiyle eşleşen Geliştirici Komut İstemi'ni açın.

  3. Repro projenizin bulunduğu dizine geçin.

  4. Geliştirici Komut İstemi konsol penceresinde, cl /Pbağımsız değişkenlerinifilename.cpp komutunu girin. Bağımsız değişkenler için, yukarıda yakaladığınız bağımsız değişkenlerin listesini kullanın. filename.cpp, yeniden oluşturma kaynak dosyanızın adıdır. Bu komut, yeniden oluşturma için kullandığınız komut satırını çoğaltır, ancak önişlemci geçtikten sonra derlemeyi durdurur. Ardından önceden işlenmiş kaynak kodunu filename.i dosyasına yazar.

C++/CX kaynak kodu dosyasını önceden işliyorsanız veya C++ Modülleri özelliğini kullanıyorsanız, bazı adımlar daha gereklidir. Daha fazla bilgi için aşağıdaki bölümlere bakın.

Önceden işlenmiş dosyayı oluşturduktan sonra, önceden işlenmiş dosyayı derlerken sorunun yine de yinelendiğinden emin olmak iyi bir fikirdir.

Ön işlenmiş dosyanın hâlâ hatayı yeniden oluşturduğunu doğrulamak için

  1. Geliştirici Komut İstemi konsol penceresinde, cl.exe'nin önceden işlenmiş dosyayı C++ kaynak dosyası olarak derlemesini belirtmek için clbağımsız değişkenler/TPfilename.i komutunu girin. Argümanlar, yukarıda yakalanan argümanlarla aynıdır, ancak /D ve /I argümanları çıkarılmıştır. Bunun nedeni, önceden işlenmiş dosyaya zaten eklenmiş olmalarıdır. filename.i , önceden işlenmiş dosyanızın adıdır.

  2. Sorunun yeniden üretildiğini onaylayın.

Son olarak, önceden işlenmiş repro filename.i dosyasını raporunuzla ekleyin.

Ön işlenmiş C++/CX WinRT/UWP kod yeniden oluşturma örnekleri

Yürütülebilir dosyanızı oluşturmak için C++/CX kullanıyorsanız, ön işlenmiş bir yeniden oluşturma örneği oluşturmak ve bunu doğrulamak için uygulamanız gereken bazı ek adımlar vardır.

C++/CX kaynak kodunu önceden işlemek için

  1. Kaynak kod dosyasını önceden işlemek için bölümünde açıklandığı gibi önceden işlenmiş bir kaynak dosyası oluşturun.

  2. Oluşturulan filename.i dosyasında #using yönergelerini arayın.

  3. Başvuruda bulunılan tüm dosyaların listesini oluşturun. Tüm Windows*.winmd dosyalarını, platform.winmd dosyalarını ve mscorlib.dll dosyasını hariç tutun.

Önceden işlenmiş dosyanın sorunu yine de yeniden oluşturduğunu doğrulamaya hazırlanmak için

  1. Önceden işlenmiş dosya için yeni bir dizin oluşturun ve yeni dizine kopyalayın.

  2. .winmd dosyalarını #using listenizden yeni dizine kopyalayın.

  3. Yeni dizinde boş bir vccorlib.h dosyası oluşturun.

  4. mscorlib.dll için olan #using yönergelerini kaldırmak üzere önceden işlenmiş dosyayı düzenleyin.

  5. Kopyalanan .winmd dosyalarının mutlak yollarını yalnızca çıplak dosya adlarıyla değiştirmek için önceden işlenmiş dosyayı düzenleyin.

Yukarıda gösterildiği gibi, önceden işlenmiş dosyanın sorunu yine de yeniden oluşturduğunu onaylayın.

Ön işlenmiş C++ Modülleri için yeniden üretim örnekleri

C++ derleyicisinin Modüller özelliğini kullanıyorsanız, ön işlenmiş bir yeniden oluşturma örneği oluşturmak ve doğrulamak için izlenmesi gereken bazı farklı adımlar vardır.

Modül kullanan bir kaynak kod dosyasını önceden işlemek için

  1. Komut satırının içeriğini raporlama bölümünde açıklandığı gibi, yeniden oluşturma işleminizi derlemek için kullanılan komut satırı bağımsız değişkenlerini yakalayın.

  2. Projenizi derlemek için kullanılan Visual Studio sürümü ve yapılandırma mimarisiyle eşleşen Geliştirici Komut İstemi'ni açın.

  3. Örnek projenizi içeren dizine geçin.

  4. Geliştirici Komut İstemi konsol penceresinde, cl /Pargümanlarıfilename.cpp komutunu girin. Bağımsız değişkenler yukarıda yakalanan bağımsız değişkenlerdir ve filename.cpp modülü kullanan kaynak dosyanın adıdır.

  5. Modül arabirimini (.ifc çıkışı) oluşturan yeniden oluşturma projesini içeren dizine geçin.

  6. Modül arabiriminizi oluşturmak için kullanılan komut satırı argümanlarını kaydedin.

  7. Geliştirici komut istemi konsol penceresinde cl /Pargumentsmodulename.ixx komutunu girin. Bağımsız değişkenler yukarıda yakalanan bağımsız değişkenlerdir ve modulename.ixx , modül arabirimini oluşturan dosyanın adıdır.

Önceden işlenmiş dosyaları oluşturduktan sonra, önceden işlenmiş dosyayı kullanırken sorunun yine de yinelendiğinden emin olmak iyi bir fikirdir.

Ön işlenmiş dosyanın hatayı hâlâ yeniden oluşturduğunu doğrulamak için

  1. Geliştirici konsolu penceresinde yeniden oluşturma projenizi içeren dizine dönün.

  2. Yukarıdaki gibi, önceden işlenmiş dosyayı sanki bir C++ kaynak dosyasıymış gibi derlemek için cl bağımsız değişkenleriyle /TPdosyaadı.i komutunu girin.

  3. Sorunun önceden işlenmiş dosya tarafından yine de yeniden üretildiğini onaylayın.

Son olarak, raporunuza .ifc çıkışıyla birlikte önceden işlenmiş yeniden oluşturma dosyalarını (filename.i ve modulename.i) ekleyin.

Modül izleme dosyası oluşturmak için

C++ modülleriyle ilgili sorunlar olduğunda, tanılama kalitesini artırmak ve geri dönüş süresini azaltmak için önceden işlenmiş yeniden oluşturma ile birlikte bir modül izleme dosyası sağlayın. Modül izleme dosyası, derleme sırasında modül işlemleriyle ilgili ayrıntılı bilgileri kaydeder.

Örnek, herhangi bir kullanıcı üst bilgisine başvurmadan tek bir kaynak kodu dosyasına daraltılabilirse idealdir.

Soruna olası bir katkıda bulunan olarak düşünmemiz gereken kod miktarını azaltmak bizim için çok yararlı olur. /MP veya çok kaynaklı çağrıların kullanılması, izlemenin yalnızca son derlenmiş dosyayı temsil etmesine veya tamamlanmamış olmasına neden olabilir. Sorunu tek bir kaynak dosyaya indiremiyorsanız, kodunuzu bir .zip dosyasına veya benzer bir dosyaya paketleyin veya bir IDE proje çözümlemesi kullanmayı düşünün. Daha fazla bilgi için bkz . Diğer yeniden oluşturmalar.

  1. Projenizi derlemek için kullanılan Visual Studio sürümü ve yapılandırma mimarisiyle eşleşen Geliştirici Komut İstemi'ni açın.
  2. [cl /d1module:enableLogging] filename.cpp trace.json komutunu girin. trace.jsoniçin modül izlemesi için istenen çıkış dosyası adını belirtin. Çıkış dosyası adı ile arasında /d1module:enableLogging boşluk olamaz. [other-args] için herhangi bir ek derleme bağımsız değişkeni ekleyebilirsiniz. filename.cpp için, sorunu yeniden oluşturan kaynak dosyayı belirtin.
  3. Soruna birden çok çeviri birimi dahilse, sorunu yeniden oluşturan belirli bir dosya için bir izleme toplamak üzere ayrı tek dosyalı çağrılar çalıştırın. Gerekirse ek ilgili dosyalar için izlemeler toplayabilirsiniz.

Son olarak, önceden işlenmiş yeniden üretim senaryosu ile birlikte oluşturulan trace.json dosyasını raporunuza ekleyin.

link repro, link_repro ortam değişkeniyle ya da /LINKREPRO bağlayıcı seçeneğine argüman olarak belirtilen, bağlayıcı tarafından oluşturulmuş bir dizinin içeriğidir. Bağlama aşamasında ortaya çıkan bir sorunu bir bütün olarak gösteren derleme çıktılarını içerir. Örnekler arasında, Bağlantı Zamanı Kodu Oluşturma (LTCG) içeren bir arka uçta kilitlenme veya bağlayıcıda kilitlenme yer alır. Bu derleme çıktıları, sorunun yeniden üretilebilmesi için bağlayıcı girdisi olarak gerekenlerdir. Bu ortam değişkeni kullanılarak kolayca bir bağlantı yeniden üretim senaryosu oluşturulabilir. Bağlayıcının yerleşik yeniden oluşturma özelliğini etkinleştirir.

  1. Komut satırının içeriğini bildirme bölümünde açıklandığı gibi, yeniden oluşturma derlemenizi oluşturmak için kullanılan komut satırı argümanlarını kaydedin.

  2. Projenizi derlemek için kullanılan Visual Studio sürümü ve yapılandırma mimarisiyle eşleşen Geliştirici Komut İstemi'ni açın.

  3. Geliştirici komut istemi konsol penceresinde, yeniden oluşturma projenizi içeren dizine geçin.

  4. Bağlantı çoğaltımı için linkrepro adlı bir dizin oluşturmak üzere mkdir linkrepro girin. Başka bir bağlantı yeniden oluşturma örneğini kaydetmek için farklı bir ad kullanabilirsiniz.

  5. link_repro ortam değişkenini oluşturduğunuz dizine ayarlamak için set link_repro=linkrepro komutunu girin. Derlemeniz, çoğu zaman daha karmaşık projelerde olduğu gibi, farklı bir dizinden çalıştırılıyorsa bunun yerine link_repro değerini link repro dizininizin tam yolu olarak ayarlayın.

  6. Visual Studio'da yeniden oluşturma projesini oluşturmak için geliştirici komut istemi konsol penceresine devenv komutunu girin. link_repro ortam değişkeninin değerinin Visual Studio'da görünür olmasını sağlar. Projeyi komut satırında derlemek için, yeniden üretilebilir derlemeyi aynı şekilde oluşturmak üzere yukarıda kaydedilen komut satırı argümanlarını kullanın.

  7. Yeniden oluşturma projenizi hazırlayın ve beklenen sorunun oluştuğunu doğrulayın.

  8. Derlemeyi yapmak için kullandıysanız Visual Studio'yu kapatın.

  9. Geliştirici Komut İstemi konsol penceresinde, set link_repro= komutunu girerek link_repro ortam değişkenini temizleyin.

Son olarak, yeniden üretim dosyalarını, linkrepro dizininin tamamını .zip veya benzeri bir dosya olarak sıkıştırıp paketleyerek raporunuza ekleyin.

/LINKREPRO bağlayıcı seçeneği, link_repro ortam değişkeniyle aynı etkiye sahiptir. Oluşturulan bağlantı yeniden üretimi için filtrelemek üzere kullanılacak adı belirtmek için /LINKREPROTARGET seçeneğini kullanabilirsiniz. /LINKREPROTARGET kullanmak için, /OUT bağlayıcı seçeneğini de belirtmeniz gerekir.

  1. Bağlantı yeniden oluşturmayı tutmak için bir dizin oluşturun. Oluşturduğunuz tam dizin yolunu directory-path olarak adlandıracağız. Boşluklar içeriyorsa yolun çevresinde çift tırnak işareti kullanın.

  2. Bağlayıcı komut satırına /LINKREPRO:directory-path komutunu ekleyin. Visual Studio'da projenizin Özellik Sayfaları iletişim kutusunu açın. Yapılandırma Özellikleri>Linker>Komut Satırı özellik sayfasını seçin. Ardından, Ek Seçenekler kutusuna /LINKREPRO:directory-path seçeneğini girin. Değişikliklerinizi kaydetmek için Tamam'ı seçin.

  3. Yeniden üretim projenizi derleyin ve beklenen sorunun ortaya çıktığını doğrulayın.

Son olarak, reproyu, directory-path bağlantısındaki repro dizininin tamamını bir .zip veya benzeri bir dosyaya sıkıştırarak paketleyin ve raporunuza ekleyin.

Diğer yeniden oluşturmalar

Sorunu tek bir kaynak dosyasına veya ön işlenmiş bir yeniden üretim örneğine indirgeyemiyorsanız ve sorun bir link repro gerektirmiyorsa, bir IDE projesini inceleyebiliriz. İyi bir tekrar üretilebilir örnek oluşturmaya ilişkin tüm yönergeler hâlâ geçerliliğini korur: Kod olabildiğince minimal ve kendi kendine yeterli olmalıdır. Sorun en son araçlarımızda ortaya çıkmalı ve uygunsa diğer derleyicilerde görülmemelidir.

Repro'nuzu en düşük IDE projesi olarak oluşturun, ardından dizin yapısının tamamını .zip bir dosyaya veya benzer bir dosyaya sıkıştırarak paketleyin ve raporunuze ekleyin.

Raporunuzu göndermenin yolları

Raporunuzu bize göndermek için birkaç iyi yolunuz vardır. Visual Studio'nun yerleşik sorun raporlama aracını veya Visual Studio Geliştirici Topluluğu sayfasını kullanabilirsiniz. Bu sayfanın alt kısmında bir Ürün geri bildirimi düğmesi de vardır. Seçim, ekran görüntülerini yakalamak ve raporunuzu düzenlemek için IDE'deki yerleşik araçları kullanmak isteyip istemediğinize bağlıdır. Bunu yapmak istemiyorsanız doğrudan Geliştirici Topluluğu web sitesini kullanabilirsiniz.

Not

Raporunuzu nasıl gönderdiğinizden bağımsız olarak, Microsoft gizliliğinize saygı duyar. Microsoft, tüm veri gizliliği yasalarına ve düzenlemelerine uymayı taahhüt etmiştir. Bize gönderdiğiniz verileri nasıl ele aldığımız hakkında bilgi için bkz . Microsoft Gizlilik Bildirimi.

Sorun Bildir aracını kullanma

Visual Studio'da Sorun Bildir aracı, Visual Studio kullanıcılarının yalnızca birkaç tıklamayla sorunları bildirmesinin bir yoludur. Bulduğunuz sorunla ilgili ayrıntılı bilgi göndermek için basit bir form açılır. Daha sonra IDE'den çıkmadan raporunuzu gönderebilirsiniz.

Sorun Bildir aracı aracılığıyla sorununuzu bildirmek, IDE'den kolay ve kullanışlıdır. Hızlı Başlat arama kutusunun yanındaki Geri Bildirim Gönder simgesini seçerek başlık çubuğundan erişebilirsiniz. Alternatif olarak, bunu menü çubuğundaki Yardım>Geri Bildirim Gönder>Sorun Bildir yolunda bulabilirsiniz.

Bir sorun bildirmeyi seçtiğinizde, önce Geliştirici Topluluğu benzer sorunlar için arama yapın. Sorununuzun daha önce bildirilmiş olması durumunda raporu destekleyin ve daha ayrıntılı açıklamalar ekleyin. Benzer bir sorun görmüyorsanız Visual Studio Geri Bildirim iletişim kutusunun altındaki Yeni sorun bildir düğmesini seçin ve sorununuzu bildirmek için adımları izleyin.

Visual Studio Geliştirici Topluluğu sayfalarını kullanma

Visual Studio Geliştirici Topluluğu sayfaları, sorunları bildirmenin ve Visual Studio ile C++ derleyicisi, araçları ve kitaplıkları için çözümler bulmanın başka bir kullanışlı yoludur. Visual Studio, Mac için Visual Studio, .NET, C++, Azure DevOps ve Azure DevOps Server için özel Geliştirici Topluluğu sayfaları vardır.

Topluluk sekmelerinin altında, her sayfanın üst kısmına yakın bir arama kutusu bulunur. Sizinkine benzer sorunları bildiren gönderileri bulmak için bunu kullanabilirsiniz. Sorununuzla ilgili bir çözümün veya diğer yararlı bilgilerin zaten mevcut olduğunu fark edebilirsiniz. Daha önce biri aynı sorunu bildirmişse, yeni bir sorun raporu oluşturmak yerine o rapora destek oyu ve açıklama ekleyin. Yeni bir soruna yorum yapmak, oy vermek veya bildirmek için Visual Studio hesabınızda oturum açmanız istenebilir. İlk kez oturum açtığınızda, Geliştirici Topluluğu uygulamasına profilinize erişim vermeyi kabul etmiş olmanız gerekir.

C++ derleyicisi, bağlayıcısı ve diğer araç ve kitaplıklarla ilgili sorunlar için önce C++ Geliştirici Topluluğu sayfasında arama yapın. Sorununuzu arıyorsanız ve henüz bildirilmiş değilse, arama kutusunun yanındaki Sorun bildir düğmesini seçin. Yeniden oluşturma kodunuzu ve komut satırınızı, ekran görüntülerini, ilgili tartışmaların bağlantılarını ve ilgili ve yararlı olduğunu düşündüğünüz diğer tüm bilgileri ekleyebilirsiniz.

İpucu

İlk Geliştirici Topluluğu raporundaki bilgiler her zaman genel olacaktır. Bu bir sorunsa Raporlar ve gizlilik hakkındaki sonraki bölüme bakın.

İpucu

Visual Studio'da Microsoft C++ Derleme Araçlarıyla (örneğin, kullanıcı arabirimi sorunları, bozuk IDE işlevleri veya genel kilitlenmeler) ilgili olmayan diğer sorun türleri için IDE'deki Sorun Bildir aracını kullanın. Bu, ekran görüntüsü özellikleri ve bulduğunuz soruna yol açan kullanıcı arabirimi eylemlerini kaydetme özelliği nedeniyle en iyi seçenektir. Bu tür hatalar Visual Studio Geliştirici Topluluğu sitesinde de aranabilir. Daha fazla bilgi için bkz . Visual Studio ile ilgili bir sorunu bildirme.

Raporlar ve gizlilik

Raporlardaki tüm bilgiler ve tüm açıklamalar ve yanıtlar varsayılan olarak genel olarak görünür. Normalde bu bir avantajdır çünkü tüm topluluğun diğer kullanıcıların bulduğu sorunları, çözümleri ve geçici çözümleri görmesine olanak tanır. Bununla birlikte, gizlilik veya fikri mülkiyet nedenleriyle verilerinizi veya kimliğinizi herkese açık hale getirmekle ilgileniyorsanız seçenekleriniz vardır.

Kimliğinizi açığa çıkarmakla ilgileniyorsanız, sizinle ilgili ayrıntıları açıklamayan yeni bir Microsoft hesabı oluşturun. Raporunuzu oluşturmak için bu hesabı kullanın.

Gizli tutmak istediğiniz hiçbir şeyi ilk raporun başlığına veya içeriğine (genel olan) koymayın. Bunun yerine, ayrıntıları ayrı bir açıklamayla özel olarak gönderebilirsiniz. Raporunuzun doğru kişilere yönlendirildiğinden emin olmak için sorun raporunuzun konu listesine cppcompiler ekleyin. Sorun raporu oluşturulduktan sonra yanıtlarınızı ve eklerinizi kimlerin görebileceğini belirtebilirsiniz.

Özel bilgiler için sorun raporu oluşturmak için

  1. Oluşturduğunuz raporda Açıklama ekle'yi seçerek sorunun özel açıklamasını oluşturun.

  2. Yanıt düzenleyicisinde, yanıtınızın hedef kitlesini belirtmek için Gönder ve İptal düğmelerinin altındaki açılan menü denetimini kullanın. Yalnızca belirttiğiniz kişiler bu özel yanıtları ve bunlara eklediğiniz tüm resimleri, bağlantıları veya kodları görebilir. Görünürlüğü Microsoft çalışanları ve sizinle sınırlamak için Moderatörler ve orijinal gönderi sahibi tarafından görüntülenebilir seçeneğini belirleyin.

  3. Açıklamayı ve yeniden oluşturma işleminiz için gereken diğer bilgileri, resimleri ve dosya eklerini ekleyin. Bu bilgileri özel olarak göndermek için Gönder düğmesini seçin.

    Ekli dosyalarda 2 GB ve en fazla 10 dosya sınırı vardır. Daha büyük dosya yüklemeleri için özel yorumunuzda bir yükleme URL’si isteyin.

Bu açıklama altındaki tüm yanıtlar belirttiğiniz sınırlı görünürlüğe sahiptir. Yanıtlardaki açılır liste denetimi, kısıtlı görünürlük durumunu doğru göstermese bile bu yine de geçerlidir.

Gizliliğinizi korumak ve hassas bilgilerinizi genel görünümden uzak tutmak için dikkatli olun. Microsoft ile tüm etkileşimi kısıtlı yorumun altındaki yanıtlarla sınırlı tutun. Diğer yorumlara verilen yanıtlar, hassas bilgileri yanlışlıkla açıklamanıza neden olabilir.

C++ belgeleri sorununu bildirme

Bir belge, hatalı kod örneği, kafa karıştırıcı bir açıklama, kritik bir eksiklik veya hatta yalnızca yazım hatasıyla ilgili bir sorun görürseniz, sayfadaki geri bildirim düğmelerini kullanarak bize kolayca bildirebilirsiniz. 2024'ten bu yana, bildirilen sorunları izlemek için GitHub sorunlarını artık kullanmıyoruz. Daha fazla bilgi için bkz. Microsoft Learn hakkında geri bildirimde bulunmak için yeni bir yol duyuruyor.

C++ belgelerimiz açık kaynak, bu nedenle kendiniz bir düzeltme göndermek isterseniz, bunu yapabilirsiniz. Belgelerimize nasıl katkıda bulunabileceğiniz hakkında daha fazla bilgi için GitHub'da Katkıda Bulunma kılavuzumuza bakın.