DÜZELTME: Visual C++ 2013'te yerleşik programlar "Geçersiz Yönerge" özel durumuyla kilitleniyor

Uygulandığı Öğe
Visual Studio Community 2013

Belirtiler

Microsoft Visual C++ 2013'ü kullanarak bir program oluşturduğunuzda, program kilitlenir ve "Geçersiz Yönerge" özel durumuyla karşılaşırsınız. Bunun nedeni, Visual C++ 2013 x64 C Çalışma Zamanı'ndaki (CRT) bazı kayan nokta matematik kitaplığı işlevlerinin, işlevler bunları kullanmaya çalışmadan önce belirli AVX ve FMA3 yönergelerinin kullanılabilir olup olmadığını doğru şekilde denetlememesidir. Yönergeler kullanılamıyorsa, bu işlevlere yapılan çağrılar geçersiz bir yönerge özel durumuna (0xc000001d) neden olur. Etkilenen işlevler log, log10, pow ve diğerleridir. 

Bu sorun aşağıdaki senaryolarda büyük olasılıkla oluşur:

  • AVX durum kaydetmeyi desteklemeyen Windows işletim sisteminin eski sürümünde (örneğin, Windows Vista) AVX yönerge kümesini destekleyen bir bilgisayarda kullanılıyorsa

  • AVX durum kaydetme özelliği işletim sistemi önyükleme yapılandırmasında açıkça devre dışı bırakılmışsa

  • Windows Önyükleme Ortamında (Windows PE)

    Not: Windows PE, AVX durum kaydetmeyi desteklemez.

Bu sorun Microsoft Connect'te bildirilmiştir:

x64 log() işlevi, işletim sisteminden bağımsız olarak vpsrlq AVX komutunu kullanır (bu nedenle Vista x64'te çöker)
        
         Visual Studio 2013Visual Studio 2013 RTM: AVX2 için C++ x64 kod oluşturma hatası yönergeleri

Neden

Bu sorun, Visual C++ 2013 x64 C Çalışma Zamanı'nın işletim sisteminin AVX veya FMA3 yönergelerini çalıştırmayı denemeden önce AVX durum kaydetmeyi destekleyip desteklemediğini denetlememesi nedeniyle oluşur.

Çözüm

Visual C++ 2013 kullanılarak oluşturulan etkilenen tüm C++ ikili dosyaları C Çalışma Zamanı DLL'sini (msvcr120.dll) kullanıyorsa, güncelleştirilmiş Microsoft Visual C++ 2013 Yeniden Dağıtılabilir – 12.0.40660.0 veya sonraki bir sürümü yükleyin.

Etkilenen C++ ikili dosyalarınız Visual C++ 2013 C Çalışma Zamanı'na statik olarak bağlanıyorsa, 3174417 düzeltmesini yükleyerek ve etkilenen ikili dosyaları yeniden oluşturup yeniden dağıtarak Visual Studio 2013 yüklemenizi güncelleştirmeniz gerekir.

Not: Bu sorun Visual C++ C Çalışma Zamanı'nın eski sürümlerini (Visual C++ 2012 ve önceki sürümler) etkilemez. Sorun, Visual C++ 2015 tarafından kullanılan Evrensel CRT'nin ilk sürümünden önce düzeltildi.

Microsoft İndirme Merkezi

Statik olarak bağlı Visual C++ 2013 C Çalışma Zamanı'nı güncelleştirmek için, 3174417 düzeltmesi yalnızca indirme güncelleştirmesi olarak yayımlanır ve Windows Update aracılığıyla dağıtılmaz. Microsoft İndirme Merkezi web sitesinde bulunabilir:

Paketi şimdi indirin.

Dinamik olarak bağlı Visual C++ 2013 C Çalışma Zamanı DLL'lerini güncelleştirmek için güncelleştirilmiş bir yeniden dağıtılabilir kullanılabilir. Daha fazla bilgi için, aşağıdaki Microsoft Bilgi Bankası makalesine bakın:

Visual C++ 2013 ve Visual C++ Yeniden Dağıtılabilir Paketi için 3179560 Güncelleştirmesi

Geçici çözüm

Bu soruna geçici bir çözüm bulmak için, bu sorundan etkilendiyseniz matematik kitaplığında FMA3'ü devre dışı bırakın. GetEnabledXStateFeatures öğesini çağırarak ve _set_FMA3_enable(0) öğesini çağırarak CRT'de AVX'i açıkça devre dışı bırakarak sistemin AVX yönergelerini destekleyip desteklemediğini sorgulayabilirsiniz.

Daha fazla bilgi için MSDN web sitesinde XState Context ile Çalışma bölümüne bakın.

_set_FMA3_enable(0) işlevi math.h'de <>bildirilir ve yalnızca x64 için derleme yaptığınızda kullanılabilir. (Bu sorun yalnızca x64 kitaplıklarını etkiler.) Bu, matematik kitaplığının FMA3 olmayan uygulamaları kullanmaya geri dönmesine neden olur.