Heisenbugs neden ortaya çıkıyor ve onlarla nasıl çalışılır? | robot_dreams
should_authorize_via_email
email.input_code tel.input_code
 
email.code_actual_for tel.code_actual_for
apply_exit_text
session_ended
to_homepage
Heisenbugs neden ortaya çıkıyor ve onlarla nasıl çalışılır?

Heisenbugs neden ortaya çıkıyor ve onlarla nasıl çalışılır?

Floating bug nedir?

Test cihazı ile programda bir hata tespit edildi, ancak tekrarlanmadı. Böylece, floating bug bulunmalı, yakalanmalı ve normale dönüştürülmelidir. Ama bunu yapmak zor olabilir.

Heisenbug hakkında bilmeniz gerekenleri ve nasıl düzelteceğinizi anlatıyoruz.

Heisenbug nedir

Heisenbug (floating bug), kendiliğinden oluşan istenmeyen bir program eylemidir. Genelde QA uzmanları bu tür hataları arar. O sebeple yüzen hataları otomatik olarak algılayan hiçbir algoritma yoktur.

Bu Terim adını kuantum fiziğindeki belirsizlik ilkesini formüle eden fizikçi Werner Heisenberg'den almıştır.

Yüzen bir hatanın (Heisenbug) ortaya çıkma nedenleri

  • Zaman

Hata ayıklama sırasında uzmanlar talimatları satır satır yürütürse, işlemler arasındaki gecikme, ürünün çalışması esnasında olduğundan birkaç kat daha büyük olabilir. Heisenbug farklı akışların etkileşiminden kaynaklanıyorsa bu özellikle doğru demektir.

  • Bellek

Hata ayıklama (debuging) sırasında değişken adresleri değişebilir. Optimizasyon yapılmadan derlenen kodun çalıştırılması, bazı değişkenlerin RAM'deki kayıtlardan taşınmasına neden olabilir.

  • Assert

Üretimde veya optimizasyon seçenekleri etkinleştirilirken her kod derlendiğinde, iddialar genellikle devre dışı bırakılır, geliştirme modunda yerel olarak derlendiklerinde ise etkinleştirilebilirler. İddiaları değerlendirmenin yan etkileri olabilir veya yalnızca yürütme süresini etkileyebilir.

  • Doluluk

Bir test cihazı, bir alanın veya kapsayıcının taştığını fark etmeyebilir ve bu bir arızaya neden olabilir. Cihazın içinde çok büyük değerler hesaplanırsa sistem baş edemez.

  • Rastgeleleştirme (randomizasyon)

Kodda randomizasyon varsa, çalıştırmalar arasında tutarsızlıklar olabilir ve hatanın oluşması için doğru koşullar aralıklı olarak oluşabilir.

Floating bug sorunu nasıl çözülür?

Evrensel bir çözüm yoktur, ancak yardımcı olabilecek teknikler aşağıdadır:

  • Sistem süreçlerinin izlenmesi

Başka hiçbir sürecin ana işleme müdahale etmemesi önemlidir.

  • GPU yerine CPU üzerinde çalıştırılması. GPU bir performans artışı sağlar, ancak varsayılan yazılım bunu desteklemeyebilir. Sisteminizdeki GPU'yu devre dışı bırakın ve CPU'da çalıştırmayı deneyin.
     
  • Rastgele sayı üreteçlerinin varlığı için kodun kontrol edilmesi. Rastgele sayı üreteçleri bularak test etmeniz ve başarılı ve yanlış çalıştırmalar için rastgele çıktıyı izlemeniz gerekir.
     
  • Tek bir NUMA düğümü üzerinde çalışması, kayan hatanın sistem mimarisindeki bir sorundan kaynaklanmamasını sağlar. Bağlantı kararsızlığı genellikle NUMA düğümleri arasında görülür.
     
  • Yazılım bağımlılığının değiştirilmesi. Heisenbug'un harici bir yazılım bileşeninden gelmemesi önemlidir. Örneğin, DNNLv1.1 ile Intel için optimize edilmiş TensorFlow'u kullanmak yerine, vanilya TensorFlow'u (kaynaktan oluşturulmuş veya pip ile yüklenmiş) deneyebilirsiniz.
     
  • Gereksiz işlevlerin birer birer kaldırılması, yüzen hatanın kaynağının hangisi olduğunu ortaya çıkaracaktır.
     
  • Stres testleri çalıştırmak, aşırı koşullar altında olası hataların belirlenmesine yardımcı olacaktır. Ancak test, hataların olmadığını kanıtlamaz. Stres testleri, yalnızca çalışma ortamında tespit edilemeyen hata riskini azaltmayı mümkün kılar.
     
  • Potansiyel bir yarış koşulunu (Yarış koşulu) tespit etmek için özel algoritmaların kullanılması. Kilit seti algoritması, paylaşılan belleğe paylaşılan bir kilit tutan iki veya daha fazla iş parçacığı tarafından erişildiğinde olası bir yarış durumunu bildirir. Yanlış pozitifleri bildirebilir. "Şuna olur" algoritması, iş parçacığı içinde ve iş parçacıkları arasında dağıtılmış sistemlerde olayların kısmi sıralamasına (okuma/yazma ve kilitleme dahil herhangi bir talimat başına) dayanır. Bu algoritma çok az yanlış pozitif üretir, ancak yürütme sırasına duyarlıdır, bu nedenle yüzen hataya neden olan yarış koşulunu tespit edebilmesi için birkaç kez çalıştırılması gerekebilir.

  • Geriye doğru hata ayıklama (debuging), hata ayıklayıcının bir program hatasından sonra duraklama ve hatanın nedenini ortaya çıkarmak için yürütme geçmişine geri gitme yeteneğidir.
     
  • Yarış durumu için özel hata ayıklama araçlarını kullanma. İşte bazı örnekler:

#1. Microsoft CHESS, paralel programlarda Heisenbug'u bulmak ve oynatmak için bir araçtır. CHESS birçok kez paralel bir testi çalıştırdığında, eğer serpiştirme bir hatayla sonuçlanırsa, CHESS hata ayıklamayı iyileştirmek için onu yeniden üretebilir.

#2. The Intel Inspector akış, bellek ve kalıcı depolama hatalarını tasarım döngüsünün erken aşamalarında bulmanıza ve hata ayıklamanıza yardımcı olur.

#3. Kiuwan - statik kod analiz aracı. Güvenlik tehditlerini çalışma ortamına girmeden önce tespit eder.

#4. RacerX hem yarış koşullarını hem de kilitlenmeleri algılamak için iş parçacığına duyarlı prosedürler arası analiz kullanır.

  • Hata ayıklama araçlarını kullanma:

C++: UDB. Hataları bulur ve düzeltir.

C#: RevDeBug. Yazılım hatalarını teşhis ederken hataları düzeltir.

Python RevPDB: İleri ve geri hareket etmenizi sağlar.

Daha fazla makale
Mustafa Çamurlu ile yaptığımız röportajda, yazılım mimarisi alanında mikroservis, serverless ve event-driven mimarilerinin önemi ve yüksek trafikli uygulamalarda karşılaşılan zorlukları konuştuk.
Yüksek Trafikli Yazılım Mimarisi Eğitimimize katılın ve dijital dünyada fark yaratma fırsatını yakalayın!