Tekrar üretilemeyen / rastgele meydana gelen bir hatayı düzeltmeye nasıl yaklaşırım?


11

Birkaç gün önce bir hatanın keşfedildiği çok dilli bir web sitemiz var. Başka bir dilde başka bir dil verisi görüntülüyordu ve aynı zamanda İngilizce gibi bir veri karışımı da seçildi, ancak sayfadaki diğer dil verilerini de gösteriyordu. Bunu nadiren yapıyor ancak web sitesinde mevcut. Kodda gezinmek de yardımcı olmuyor çünkü bu her zaman gerçekleşmiyor.

Sorunu zamanında bulma konusunda herhangi bir öneriniz var mı? Burada stratejiler istiyorum.


4
Bu hatanın gerçekleşmesine izin verecek durumlar için kodu araştırmaya başlayın (
tersi

Yanıtlar:


20

İlk adım denemek ve hangi özelliklerini belirlemektir olabilir bu tür bir sorunu neden olur. Bu, kodun bölümleri için doğru dili seçmekle ilgili olduğundan, aşağıdakileri dikkate alarak başlayın:

  • Dil nasıl algılanır? HTTP isteğindeki bilgilere dayanıyor mu? Oturum bilgilerine mi dayanıyor? Veya veritabanı alanlarına mı dayanıyor? Temel olarak, bu, uygulamanızın her bölümün dilini nasıl seçtiği ile ilgili bir sorun olabilir mi?
  • Dil nasıl görüntülenir? Bir özellikler dosyasından mı yoksa bir veritabanından mı çekiyorsunuz? Doğru dile yapılan göndermenin nasıl kaybolması mümkün müdür? Gördüğünüz karma site her zaman varsayılan site mi?
  • İstemci ortamıyla bir korelasyon var mı? Bu ilk kurşunla ilgilidir, ancak biraz daha ileri gider. Aşağı akım önbellek proxy'leri nedeniyle garip oluşturma sorunları yaşadım. Genellikle bu tür sorunlar, eski olan veya bir kişinin sayfasını diğer kullanıcılara sunan (utanç verici) bir sayfadır.
  • Bir Yerel İş Parçacığı değeri mi kullanıyorsunuz? Bir istek birden fazla iş parçacığım tarafından işlenirse, iş parçacığı yerel değeri, o anda çalışan iş parçacığına bağlı olarak farklı bilgilere sahip olur. Bir web sunucusu ortamında, işlemeye başladığınız iş parçacığının, işleminiz için tamamladığınız iş parçacığının aynı olacağını varsayamazsınız - bu, platformunuzun spesifikasyonunun bir parçası değilse. Sunucu yazarları, küçük bir iş parçacığı havuzunu yeniden kullanırlar ve çok sayıda çalışmayı parçalar halinde kendilerine kullanırlarsa, aynı anda daha fazla istekte bulunabilirler. Bir isteğin başından sonuna kadar bir iş parçacığınız olsa bile, sunucu aynı iş parçacığındaki diğer istekleri aynı anda çoğaltabilir. Yerel iş parçacıkları yerine, bu değeri istek veya oturum özniteliklerine bağlamayı düşünün.

Eğer karakterize bir kez Şimdi olanaklarını ters gidebilir ne, 's zaman emin sen denemek ve öğrenmek gerek veriye sahip olmak için yaptım gitmek yanlış.

  • Sorunlu alanlarda bolca günlük kaydı kullanın. Bu, Log4J veya Log4Net gibi bir aracın gerçekten parlayabileceği bir yerdir. Bu günlük kaydı çerçevesi ve buna benzer diğerleri, bir yapılandırma dosyasını değiştirerek her şeyin gürültüsünü korurken belirli kategoriler için günlük kaydını açmanıza olanak tanır. Şüphelendiğiniz şeyin sorun olup olmayacağını anlamak için yeni günlük ifadeleri eklemek istiyorsunuz. Ayrıca, HTTP erişim günlüklerinizin her istek (çerezler, http başlık parametreleri, vb.) Hakkında istediğiniz tüm bilgilere sahip olduğundan emin olun.
  • Sorunu simüle etmeye çalışın. Bu düzensiz gerçekleştiği için, gerçekleştiği anda sunucudaki yük nedir? Birçok dilden eşzamanlı isteklerle karşılaşıyor musunuz? Öyleyse, test ortamınızda bu tür bir yük simüle etmeyi deneyin. JMeter'e benzer bir araç ihtiyacınız olan şey olabilir. Ayrıca sahte istemcileriniz için IP adreslerini taklit etmek isteyebilirsiniz. IP adreslerinin adresin ilk iki kesimine dayandığı ülke / bölgeyi anlayabilmeniz için IP adreslerinin bölümlere ayrıldığını unutmayın.
  • Sorun, test ortamınızda olduğu gibi düzensiz olacaktır, ancak gerçek nedeninize daldıkça , vahşi doğada olduğundan daha sık gerçekleşmesi için sonuçları eğebilirsiniz . Ayrıca, günlük dosyalarını daha kolay bir şekilde inceleyebilir ve onlardan öğrenmeyi deneyebilirsiniz.
  • Bu yinelemeli bir süreç, bu yüzden sabırlı olun. Hatayı yeniden üreteceğini düşündüğünüz yük türünü indüklemeniz, günlükleri kontrol etmeniz ve bulduklarınıza göre testlerinizi hassaslaştırmanız gerekir. Önemli olan sorunu tanımlamaktır , bu yüzden sadece gerçek sorunun daha az sıklıkta gerçekleşmesini sağlayacak bazı basit düzeltmeler yapma isteğine karşı koy.

Son olarak, sorunu nasıl yeniden üreteceğinizi ve neye neden olduğunu bildiğiniz noktaya kadar daralttıktan sonra, sorunu kodda zorlamak için yapabileceğiniz en küçük otomatik testi yazın. Sorunu bir sınıfa daralttıysanız veya birlikte düzgün çalışmayan bir çift sınıf varsa, o düzeyde yeniden oluşturun. Bunu yapmak için 100 iş parçacığı oluşturmanıza gerek yok, sadece sorunun% 100'üne neden olabilecek en küçük testi yapın.

Şimdi düzeltebilir ve sizi tekrar ısırmaya gelmeyeceğinden emin olabilirsiniz.


10

Hata geri alınamaz. Henüz nasıl yeniden üreteceğinizi henüz bilmediniz.

Bazı Random () ifadesinin dönüş değerine dayalı bir istisna atmadığınız sürece hiçbir hata rastgele değildir.

Bunun anlambilime benzediğini biliyorum ama bunu kendinize anlatmak zihinsel olarak güven verici.

Sadece karmaşık yarış koşulları veya benzeri nedenlerden dolayı oluşan bir hatanın nasıl yeniden üretileceğini öğrenmek çok zor ve sinir bozucu.

Nasıl bulacağına gelince, size daha fazla bilgi verebilecek yerlerde uygulamayı açar / eklerim.

Daha sonra hatayı gören insanlara (Devs, QA, son kullanıcılar olsunlar), gerçekleştikleri anda gördükleri anda rapor vermelerini ve ardından günlüklerinize danışmasını söyleyin. Onlardan başka bilgi isteyin ve hata sadece birkaç farklı sistemin etkileşimi veya bir yarış durumu nedeniyle olabilir

Umarım bir ipucu bulabilirsin.


Donanımsal beyaz gürültü üretecinden türetilmedikçe Random () çağrıları bile rastgele değildir. Bunlar psuedo-random, yani sayılar matematiksel olarak mümkün olduğunca rastgele bir sırada dağıtılır. Ancak aynı "tohum" değerinden başlarsanız, her seferinde aynı cevabı alırsınız.
Berin Loritsch

1
@Berin: Biliyorum.
Gilles

+1 için "henüz nasıl çoğaltılacağını henüz öğrenmediniz." Tüm hataların kök nedeni vardır, yoksa olmazlardı.
Mike S

1
Rastgele () olmak zorunda değildir, zamanlamaya bağımlı olan şeylerin, özellikle paylaşılan bir kaynağa uygunsuz erişimi içeren şeylerin çoğaltılması çok zor olabilir.
Loren Pechtel

2
@Gilles: Ancak makul ölçebileceğiniz herhangi bir şey üzerinde deterministik olmayabilirler. (Diyelim ki, tam olarak başka bir görev yayınlandığında zaman dilimi.)
Loren Pechtel

5

Kodunuzda, sorunun oluştuğunu tanıyabileceğiniz yerler bulmaya çalışabilirsiniz (örneğin, bir yöntemdeki tutarsız parametreler), denetimleri kodunuza ekleyebilir ve hata ayıklama günlüğüne (yığın izlemesi, nesneler gibi) ek bilgi eklemelerine izin verebilirsiniz. oturuma eklendi, vb.)

Bunu biraz şansla yaparak, olaylar hakkında bilgi yakalayabilir ve soruna geri dönebilirsiniz.


2

Otomasyon, bazen başarısız olan çoğaltmak için aynı adımlarsa, bunu otomatikleştirin ve bir döngüye koyun. 50.000 kez koşun ve gerçekleşmesi çok muhtemel.


Olay rastgele değil, sadece rastgele görünüyor. Bunu yapmak görünmesini sağlayabilir, ancak neden ortaya çıktığı hakkında çok az bilgi verecektir .
Josh K

1
@Josh - Yeniden üretemiyorsa, bunu yapmanın ve hata ayıklama sembolleri içeren bir yığın izlemesi elde etmenin iyi bir yolu olabilir. Bunun harika bir ilk adım olduğunu düşünüyorum - ilk elden görmek
Kieren Johnstone

Bir yığın olduğunu ve elde edilebilir olduğunu varsayıyorsunuz. Bize uygulama veya bu tür bir yük altında hata ayıklama için ne kadar erişilebilir olduğu hakkında herhangi bir teknik bilgi vermedi. Bu bir hata ayıklama stratejisi değil , kırıldığı anı yakalamaya çalışan bir çekiçle vuruyor.
Josh K

@Josh - gerçek dünyadaki tecrübem bana bir hatayı araştırmak / düzeltmek için en değerli şeyi ilk elden görmek olduğunu söylüyor. Zamanlama ile ilgili bir şey, bir yığın iz, günlüklerde bir şey veya başka bir şey olsun. Mümkün olduğunda, rastgele bir şekilde ortaya çıkan sorunların bir döngüde test edilmesi beni gerçekten çok hızlı bir şekilde oraya getirdi. Farklı bir fikriniz varsa, mesih uğruna cevap olarak gönderin - bu geçerli bir yöntem ve geçerli bir cevaptır.
Kieren Johnstone

Kabul etmiyorum ve berin'in cevabının bunu çözmek için doğru yol olduğuna inanıyorum .
Josh K

1

bu problemin kendini göstermesine neden olan koşulları tespit etmek için kalıplar bulmaya çalışın. Bu sizi kodunuzun başarısız olan (veya tutarsız davranan) bölümlerine yönlendirmelidir.


Kahretsin ..............
theringostarrs

0

Sorun ne zaman algılayabilir edilir meydana gelen? Öyleyse, sistemin durumu hakkında o noktada güvenilir bir şekilde bilgi verebilir misiniz?

Bu soruların her ikisinin de cevabı evet ise, kodunuzu hata oluştuğunda olabildiğince fazla bilgi günlüğe kaydedecek şekilde ayarlayın, ardından bekleyin.

Bu, başkalarının önerdiklerinin yerini almaz (kodun gördüğünüz duruma nasıl ulaşacağını düşünmeniz gerekir), ancak hatayı istediğiniz zaman yeniden oluşturamadığınız sürece, ortaya çıktığı durumları boşa harcamamak iyi bir fikirdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.