"Check failed: 12 == (*_" hatasının çözümü
macOS üzerinde Microsoft ClearScript V8 kullanırken görülen “Check failed: 12 == (*_” hatası için uygulanabilir çözüm notları.
Microsoft ClearScript V8 ile javascript kodu çalıştırıyorsanız ve bunuda MacOS işletim sisteminde yapıyorsanız, Check failed: 12 == (*_ hatası ile karşılaşmanız daha olası.
Bu hata, nedenleri aynı ama iki farklı çözümle karşımıza çıktı.
Açıklamak için aşağıda c# dilinde basit bir örnek kod ekledik ama hatayı bu kodla almamız pek mümkün değil :).
V8ScriptEngine? v8=new V8ScriptEngine([flags]);
string code=
"var sayi_1 = 1, sayi_2 = 2;" +
"var sonuc = sayi_1 + sayi_2;";
v8!.Execute(code);
Bu kodu çalıştırdıktan sonra eğer v8!.Script.sonuc ile oluşan değere (daha doğrusu çalıştırılan kod içinde oluşan değişkenlere) erişmek istediğimizde işler karışıyor.
- İlk karşılaştığımız neden undefined değişken değeri; örnekte sonuc değişkeninin değerini 3 olmasını bekliyoruz ama atladığımız bir nokta olduğunu farzedelim ve değişkenimiz undefined olduğunu düşünelim. O zaman erişmek istediğimizde vakit kaybetmeden hataya düşüyor :). En basit çözümü erişmek istediğimiz değişkenin kontrolünü yaparak ilerlemek veya try catch bloğu arasında kullanmak.
if(v8!.Script.sonuc is Undefined)
{
.........
}Konumuzla alakalı değil ama bir hatırlatma notu eklemekte fayda var, try-catch bloğu ve if komutu kodlama anında en az kullanılması gerekenlerdir.
- Diğer nedeni ise MacOS: Bu hatayla 2. kez karşılaştığımızda sunucuya(windows) atalım bakalım ne oluyor dedik ve kodların problemsiz bir şekilde çalıştığını gördük.
Aradık taradık ClearScriptLib adlı kullanıcının şuradaki konuyla alakalı yorumuna çözümü geldik.
Bu problem için 2 çözümlede o karşımıza geliyor;- V8 oluşturucusundaki flag tanımlamalarını yaparken JIT derlemesini iptal edin,
- "dotnet nuget locals global-packages --list" komutuya paketlerinin yerini öğrenin ve o dizine gidin ve şunları yazın
cd microsoft.clearscript.v8.native.osx-x64
cd 7.3.7 (Buradaki versiyon numarası olduğundan değişkenlik gösterebilir)
cd runtimes
cd osx-x64
cd native
Bu işlemlerde sonra şu dosyanın orda olması gerekiyor:ClearScriptV8.osx-x64.dylib
Bu dosya için şu komutu çalıştır, projeyi temizle, build et ve çalıştır.
codesign --sign - --options linker-signed --force ClearScriptV8.osx-x64.dylib
Kısa rehber
Ne zaman kullanılır?
Bu hata özellikle V8/ClearScript gibi gömülü JavaScript motorlarıyla çalışan .NET projelerinde karşımıza çıkar. Sorun bazen koddan, bazen ortamdan, bazen de beklenmeyen bir değişken değerinden kaynaklanır.
Dikkat edilecekler
- Hatayı yalnız stack trace ile değil, işletim sistemi ve paket sürümleriyle birlikte inceleyin.
- Script içinde oluşan değişkenlerin gerçekten beklenen değeri taşıdığını kontrol edin.
- MacOS, Linux ve Windows ortamlarında aynı kodu ayrı ayrı test edin.
Sık yapılan hata
Tek makinede çalışan çözümü kalıcı çözüm sanmak risklidir. Bu tip hatalarda ortam farkı küçük görünür ama sonucu tamamen değiştirebilir.
Kalıcı çözüm için not
Hata çözümü yaparken yalnız hata mesajını kapatmak yeterli değildir. Sürüm, işletim sistemi, bağımlılıklar, karakter kodlaması, sunucu ayarı ve log kayıtları birlikte incelenmelidir. Kalıcı çözüm için hatanın çıktığı ortamı, bağımlılıkları ve veri akışını birlikte değerlendirmek daha sağlıklı sonuç verir.