Bir hatayı düzeltmek için tüm yollar tükendiğinde ne yapmalı


13

Çapraz Platformlu Mobil Uygulama (1 kişilik ekip - bu yüzden sadece kendim) üzerinde çalışan bir Junior Programmer (4 aylık kariyer deneyimi).

Ben oldukça büyük (30 farklı başlık dosyaları, her biri kendi cpp dosyası ile) bu program / app bir hata var. Hata ile neler olup bittiğini tam olarak izlemeye çalışıyorum ve ayrıca düzeltmeye (hatta sadece çalışmasını sağlamak için bazı hack'leri kullanmaya çalıştım) ama yaklaşık bir düzine veya daha fazla çözümden (soruna neden olan fikirlerim var) Hiçbir şey bulamadım beni tam olarak ne hata olduğunu izlemek için ya da hata düzeltildi.

Bazı geniş tekniklerin genç bir programcısı için herhangi bir tavsiyeniz var mı (koşmaya gidin, tüm kodumu kağıda yazdırın ve bir kalemle geçirin, vb.) Bu hatada bana yardımcı olmak için kullanabilir miyim?

Böceğime biraz daha bağlam vermek için; çapraz platform API Mosync'i içerir, belirli bir eylem dizisi gerçekleştirdiğimde, mevcut ekran, daha önce görüntülenen ekranın geçerli ekran yerine hala işaretçi / tuşa basma olaylarını aldığını yeniden çizmez (ve görünür).

Belirli bir sekans:
- Menü Ekranı Görüntüleniyor - "Önceki siparişleri göster düğmesini" tıklayın
- Önceki Siparişler Ekranı Görüntüleniyor - "Dosya yükle" yi tıklayın, ardından menü düğmesini tıklayın ve Teslimat Ekranını açın
- Teslim Ekranı Görüntülenti - menü düğmesini tıklayın ve Satın Alma Ekranını açın
- Satın Alma Ekranı Görüntülenti - Buradaki hata, bu ekrana giriş görüntülenmiyor / tepki vermiyor, ListViews kaydırma yapmıyor, düğmeler tıklamalara tepki vermiyor, ListView hücreleri tıklamalara yanıt vermiyor


Gemide tavsiye alacağım, hata her seferinde aynı adımları takip ederek% 100 tekrarlanabilir, ancak işaretçi olaylarının nasıl iletildiğini ve API'nin bir parçası olamadığım için hangi ekrana ulaşmak (veya nasıl yapılacağını bilmiyorum).

Ayrıca farklı bir çift gözümün çalışmamı geçmesini ve hatayı işaret etmesini isterdim, ancak 1 kişilik bir takım olduğumu söylediğim gibi, patronum beni yönetiyor, şirketin sahibi ve bir uygulama için fikirleri var ama c ++ ya da herhangi bir yeni dil bilmiyorum (kobal? Bence hepsi bu). Şirketin fikri kodunu / malını ihlal etmeden / göstermeden ikinci bir gözün nasıl alınacağına dair herhangi bir tavsiye var mı?

... ve bu ücretli stajdan ayrılmak bir seçenek değil, sözleşme, 12 aylık bir sözleşmenin 6mn'sinden önce ayrılırsam yıllık maaşımın% 30'unu ödemekle yükümlü olabileceğimi söylüyor


6
% 100 tekrarlanabilir mi?

5
Basit cevap iş arkadaşlarınızı dahil etmektir . Bir ekip olarak bunu birkaç dakika içinde çözeceksiniz.
Fattie

2
@Joe - her zaman değil. Örneğin, farklı alt sistemlerin, rollerinin inceliksiz uyumsuz görünümleriyle inşa edildiği, spesifikasyonlardaki açık olmayan belirsizlikler nedeniyle inşa edilen çok karmaşık etkileşimli alt sistemlerin kolektif davranışındaki hatalar - tipik olarak çok az insan, birden fazla alt sistem ve etkileşimleri hakkında ayrıntılı bilgiye sahiptir. bu sorunları teşhis edebilmek. Bazen tüm ekiplerin konuşmasını sağlamanız gerekir ve iki kişi birbirlerini moron çağırmaya başladığında, uyumsuz varsayımlarla çevresel olarak ilgili bir şeyi tartışma şansı vardır.
Steve314

Hesaplarını birleştirdim. Yahoo OpenID'nizi oturum açmak için kullanabilirsiniz. Sorunuzu, yanıt olarak gönderdiğiniz bilgileri içerecek şekilde de düzenliyorum.
Adam Lear

Btw. Aşağıdaki yanıtıma ek olarak, Wikipedia'da Mosync'in artık korunmadığını okudum?
Brad Thomas

Yanıtlar:


19

Sorunu% 100 oranında yeniden oluşturabiliyorsanız, son adımda (mümkün olduğunca erken) bir kırılma noktası ayarlayın. Tüm çağrı yığını boyunca yürürseniz, bir yerde beklenmedik değerlere veya çağrılması gereken ama olmayan bir şeye geleceğinizden eminim.

Düzenle:

Ve eğer zekânızın sonunda oturup hatayı düzeltmeye çalışıyor ve parlayan bir ışık tavsiyesi alacağınızı umarak buraya gönderiyorsanız, uzaklaşın . Git başını temizle ve daha sonra geri gel (tercihen yarın veya haftasonundan sonra). Bütün bir günü, sadece uzaklaşmak, ertesi gün net bir kafa ile geri gelmek ve on dakika içinde bulmak için belirli bir soruna çözüm bulmak için harcadığım birçok zaman geçirdim.


4
ve herhangi bir nedenden dolayı bir hata ayıklayıcı kullanamıyorsanız, işlev çağrılarınızı bir metin dosyasına kaydeden başarısız olduğunu düşündüğünüz kod bitinin etrafına bazı izleme bilgileri koyun.

3
"Walk away" için +1. Çekip gittiğinizde muhtemelen problemi kırmaktan daha verimli olacağını bilmek çok fazla deneyim gerektirir. Durumunuz bu özel deneyimi toplamaya başlamak için iyi bir yer gibi görünüyor.
Mike Sherrill 'Cat Recall'

Yazılımınızın hatayı tespit etmek için bir kesme noktasına ihtiyacı varsa, beyninizin de buna ihtiyacı vardır. Bu, kendinizi zorlamaktan ve uzaklaşmaktan daha fazla zaman kazandırır.
setzamora

Ilgili olabilecek değerleri günlüğe kaydetme işlevleri genellikle bu tür bir şey izlemek için daha iyi bir yol buldum. Günlük satırlarını düzgün sütunlarla biçimlendirin, böylece değişiklikler gözünüzün önündedir. Bu günlükleme işlevini sık sık çağrıldığı yerin kimliğiyle çağırın. Günlük dosyasını değişkenleri izleyerek atabileceğinizden çok daha hızlı inceleyebilirsiniz.
Loren Pechtel

10

Hata ayıklama, sorunun tam olarak ne olduğunu izole etmek ve anlamakla ilgilidir (düzeltme uygulamakla karşılaştırıldığında)

Hata ayıklama sırasında dikkat edilmesi gereken bir şey, farklı teorilerden sonra atladığınızı görmeye başlamanızdır, çünkü bu genellikle daha uzun süren rüzgarlar ve olası sorunları sistematik olarak ortadan kaldırmaz.

Genellikle bu tür durumlarda hata ayıklamanın en iyi yolu, sisteminizi küçük parçalara bölerek ve her parçayı tek başına çalıştırarak ve her karmaşıklık unsurunu kırılıncaya kadar tek tek ekleyerek sıkıcı sistematik yaklaşımdır. O zaman kesin sorunu izole ettiniz. Bu şekilde biraz sıkıcı ve daha açık bir iş görünebilir, ancak karmaşık bir yazılım parçasında hata ayıklamaya çalışırken değişkenleri kaldırır ve beyninizi aklınızdan çıkarmaz.


5

Bunlar geçmişte yaptığım bazı şeyler, tabii ki her durumda çalışmayacaklar:

  1. Bunun bir hata (sadece kara büyü değil) bulunmaktadır içinde sadece kodu ve bir yerlerde olduğunu fark CAN düzeltin.
  2. Bir ara ver.
  3. Kodda çok yavaş ilerleyin, her adımı analiz edin ve herhangi bir şey üzerinde parlamadan değil, onu ve ne yaptığını anladığınızdan emin olun.
  4. Soruna bakmak için ikinci bir göz al.
  5. Uyu ve yarına kadar unut (başını temizle), yeni bir bakış açısıyla gel).
  6. Kodunuzu yazdırın ve her satırı analiz edin, kenar boşluklarında not alın, her satırın her anlamını anlayın
  7. Kritik bir hata değilse, ancak kullanıcının bilmemesi gereken hatalara neden oluyorsa, (utançla, ama dürüstçe) hatayı yakaladım ve yuttum ! Tehlikeli değilse ve sebebini bulamıyorsanız, bazen sadece tuzağa düşersiniz ve kullanıcının bir şey olduğunu bilmesine izin vermezsiniz. Her şey müşteri için YG ile ilgilidir ve bazen buna değmez.
  8. Böceğe, onu avlayıp öldüreceğinizi sözlü olarak söyleyin. Bazen kaçar. :-)

+1 bu kara büyü değil!
Guy Sirton

Bugün kodumuzda aldığımız tüm karmaşık bağımlılıklar ile kara büyü. Ama ona iyi gelebilirsin :)
Subu Sankara Subramanian

3

Genellikle hataları giderirken bu yaklaşıma sahibim.

  1. Hatayı yeniden oluşturmak için adım adım güzel bir oluşturma
  2. Adım adım basitleştirin
  3. Hata kodu nerede oluşur? Hangi işlevler gibi?
  4. Hata oluştuğunda kod hangi yolu seçer, çağrı zinciri.
  5. Konum üzerinde odaklanın, ne zaman tamam değil. Ardından, hatanın oluştuğu noktayı bulana kadar bu işlemi tekrarlayın.
  6. Bu neden oluyor?

Bu noktada, soruna odaklanma sürecinde çok şey öğrendiğimden ne olduğu genellikle açıktır, bu yüzden ne yapacağımı biliyorum. Ya da bir forumda sorabileceğim oldukça odaklanmış bir sorum var.

Sonra sorunu düzeltmeye çalışıyorum ve hatanın giderilip giderilmediğini doğrulamak için birinci adımda oluşturduğunuz adım adım kullanımı kullanıyorum.


3

Önceki tüm öneriler mükemmeldir ve bunların çoğu hata / hata ile ilgili varsayımları doğrulamayı ve daha sonra hatayı bulmak için bir hata ayıklama sürecini izlemeyi amaçlamaktadır (bazen hata etrafındaki ortamı inceleyerek bazen doğrudan kodda).

Kıdem veya uzmanlığınıza bağlı olmaksızın, bu yaklaşım her zaman işe yaramayacaktır. Bazen problem üzerinde başka bir göz setine ihtiyacınız vardır. Sorunu inceleyecek birini veya sizinle hata ayıklama oturumunu bulun - genellikle yalnızca kod aracılığıyla konuşmak sizi hataya götürür.


Katılıyorum, bu benim için sık sık işe yaradı.
Mike Dunlavey

1

Diğerlerinin söylediği gibi 1) güvenilir bir şekilde çoğaltabilir ve 2) bir hata ayıklayıcıda gerçekleştiği noktaya kadar ileriye doğru ilerleyebilir.

Bunu yapamam, ne olursa olsun, ben hata göstermeyen kodun farklı bir sürümüne sahip gerektiren iki yöntem daha var.

  1. Kodun her iki sürümünü de hata ayıklayıcılar altında yan yana çalıştırın. Kötü olandan iyi olandan farklı bir şey yapana kadar onları adım atın.

  2. Kodun iyi ve kötü sürümlerini çalıştırmak için alternatif. Bir var diff veya sürümleri arasındaki farkı diğer bazı listesi. Ardından, diğerinden daha yakın olması için sürümlerden birinin kodunu kademeli olarak değiştirin. Kötü olan iyi olursa ya da iyi olan kötü olursa, değişikliği geri alır ve daha küçük bir değişiklik yaparım. Bu şekilde ben böcek üzerinde eve. Bunu "sorunun her iki tarafına geçip merkeze doğru çalışmak" olarak düşünüyorum. Bu yöntemde hata ayıklayıcı gerekmez.

Sorun çoğaltmak zor ise, o zaman o zaman böyle bir yığın dökümü olarak alabilirsiniz kadar çok bilgi ihtiyaç yoktur olur. Bu yüzden bu teşhisleri alabileceğimden, sorunun ortaya çıkmasını bekleyebildiğimden ve umarım bulabilmek için yeterli bilgiye sahip olduğumdan eminim.


1

Elinizi bir genç programcı olarak yapmak için görevlendirildiyseniz, bunu tek başınıza halledebildiğinize inanan en az bir kişi var.

Daha sonra, amirlerinizden yardım istemeden önce, bir hurda kağıdına, hatayı izlemek için attığınız adımların / yöntemlerin listesini, ne kadar ilerlediğinizi, neden her yöntemi bıraktığınızı ve ne öğrendiniz? her denemede. Ayrıca, şimdiye kadar proje hakkında öğrendiklerinizi de özetleyin.

Muhtemelen, bunu yazmayı bitirdiğinizde, yapılabilecekler körü körüne belirginleşmelidir. Varsa, hatayı yeniden üretmek için kendini ortaya çıkaran şeyleri takip etmeniz ve düzeltmeyi denemeniz yeterlidir. Değilse, üstlerinizle konuşabileceğiniz bir topraklamaya sahipsiniz. Yaptıklarınızı göstermeden yardımlarını isterseniz, sizi olumsuz etkileyebilirler.

Ancak, kafanızı temizlerseniz, hafta sonundan sonra geri gelirseniz, kimsenin yardımı olmadan hemen çözebilirsiniz. Bu her zaman olur.


'Eğer işi bir genç programcı olarak yapmakla görevlendirildiysen, bunu tek başına halledebileceğine inanan en az bir kişi var.' Çalışsaydım, tüm geliştiricilerin, homeowrk yaptıktan sonra bir çözümleri yoksa, ekip çalışması denirse yardım istemeleri bekleniyor.
mattnz

@mattnz Tüm önerdiğim, yardım istemeden önce şu ana kadar yapılan çabaların bir dokümantasyonunu yapmak ve bilinen tüm seçeneklerin tükendiğini görmek. Buna ne diyeceğimi bilmiyorum, ama takım çalışmasına ne dediğini asla tartışmadım.
vpit3833

Kendi başınıza olduğunuzu ima eden '... hepsini tek başınıza halledebilme yeteneğine' işaret etmek istedim. İstediğinizden biraz daha güçlü yorumladığımı bilmekten memnunum.
mattnz

0

Yöntem oldukça farklı olduğu için çoğaltmanın ne kadar zor olduğunu bilmeliyiz. Güvenilir bir şekilde yeniden üretilen bir kusur için, otomatik olarak hataya neden olun. Hata ayıklayıcıları ve hata ayıklama izlerini kullanın (izlerin yarış durumu türü kusurları üzerinde en az etkisi vardır). Metodik olun. Her seferinde bir adım, her adım daha fazla bilgi sağlar, hatta zaten bildiğinizi doğrular. Sürpriz bir sonuç alırsanız, devam etmeden önce durun,% 100'ü anlayın. Acı verici bir şekilde yavaştır, ancak yeterince zaman verirseniz sizi daima nihai sonuca götürür.

Eğer onu düzeltemezseniz, o zaman bir sorununuz var, onu düzelttiğinizi nasıl onaylıyorsunuz? Hata ayıklama kodunu girin ve orada bırakın. Sonunda, kendinize sorun, "Kapalı: DNR" geçerli bir seçenek midir? (Yapamadı / değiştiremedi). İş dünyasında, sonuçta bu bir maliyet / fayda kararıdır.

Kütüphanelerinizin doğru olduğunu varsaymayın, doğrulayın.

Bir mola verin, maliyete karşı düzeltme ihtiyacı hakkında pragmatik olun ve her şeyden önce, başka birisinden yanınıza oturmasını ve yardım etmesini isteyin.


0

Burada çok iyi cevaplar var. Diğer birkaç ipucu:

Kullanıcı arayüzleri nadiren tek başlarına yaşıyor. Hatayı yeniden oluşturmak için gereken minimum özellik kümesiyle bir test programı oluşturun. Kullanıcı arayüzü iyi tasarlanmışsa, başarısız olan kullanıcı arayüzü bileşenlerini ayırabilir ve bunları bir test programında tek başına çalıştırabilmeniz gerekir. Yine de sorunu yeniden oluşturabilir misiniz? Öyleyse, sorun muhtemelen kullanıcı arayüzü yapınızda veya çerçevenizde olabilir. Kullanıcı arayüzü yapınızı kontrol edin - özellikle görünmez öğelere dikkat edin. ListView'i tıkladığınızda tam olarak ne olduğunu öğrenmeye çalışın ve yanıt vermiyor - hangi olay işleyicileri çağrılıyor? Unutmayın, UI çerçevesinin kendisinde hatalar olabilir - bu sonuca atlamayın, ancak bunu açıkça dışlamayın. Hızlı bir test, Mosync sürümünüzü yükseltmek ve semptomların uyup uymadığını kontrol etmektir.

Başarısız: Test programınızda ne kaldı? Kalanların tüm bileşenlerini, özellikle de çalışan iplikleri anlayın. Arka planda veritabanı bakımı yapan bir şey mi var? Bir tür dosya biriktiricisi mi? NSA kullanıcı davranışı izleme kodu? Kullanıcı arayüzü bu bileşenlerin bazılarıyla mı çalışıyor (muhtemelen perde arkasında)? Kullanıcı arayüzü hangi arka plan işlemlerine bağlıdır?

Hata yaparken zorluk göz önüne alındığında, önemli ölçüde zaman harcamanız gereken kodu okurken, hatanızı gizleyebilecek bazı kötü uygulamalara dikkat edin. Özellikle, bunlardan herhangi birini görüyor musunuz?

try {
    SaveTheWorld();
} catch (std::exception& ex) { /* oh it didn't work, let's just ignore it */ }

Bu inanılmaz derecede zayıf bir uygulamadır ve bu nedenle oldukça yaygındır (hey, çökmedi!). Bunu yapan herhangi bir kodu en azından günlüğe kaydetmek için yükselttiğinizden emin olun - tercihen yanlış istisna işlemeyi tamamen kaldırın. (Temel kural, istisnanın ne olduğunu bilmiyorsanız, bunu işlemeye hazır değilseniz.) C stili API'lerle etkileşime giriyorsa, bırakılan hata kodu döndürme değerlerine dikkat edin ve etkileşimde bulunduğunuz araçlardan hata durumu bilgilerini kontrol ediyorsunuz.

Test programınızın şimdi hataları nasıl düzgün bir şekilde ele aldığını görünce ve bu şekilde oluşturduğunuz günlüğü okudunuz, ancak yine de hiçbir şey hatayı vurgulamıyor, inceleyebileceğiniz arayüzleri arayın. Kapakların altında olması gereken bir ağ işlemi var mı? Eğer öyleyse, Wireshark ile vur. Veritabanı işlemi? Bazı sorgu günlüğü kaydetmeyi veya veritabanı sunucusu durumunu kontrol etmeyi deneyin. Dosya sistemi mi yoksa ağ paylaşımları mı vuruluyor? Ara dosyaları kontrol edin veya G / Ç'yi izlemek için bir hata ayıklayıcı kullanın. Donanım G / Ç? Monitör ve prob. Ampirik olun. Kullanıcı arayüzü, beklemediğiniz bazı arka plan işlemlerine asılabilir.

Son olarak: Panik yapma. Sakin olun ve denediklerinizi takip edin. Hâlâ bulamıyorsanız, yağmurlu bir günde izlenebilmek için "bilinen bir sorun" haline gelmek zorunda kalacaksınız. Eğer bu şekilde gitmesi gerekiyorsa, bu kararı haklı çıkarmak için birçok malzeme isteyeceksiniz.


0

Şeylerin şemasında, tekrarlanabilir hatalar (nispeten) kolaydır! Neden? Çünkü hata kaybolana kadar her zaman kodu en aza indirebilir ve daha sonra hangi kodun buna neden olduğunu bulmak için tekrar çalışabilirsiniz. Yani bu bir yöntem. Tekrarlanabilir, yaratık kontrolünüz altında. Onu dürtüp deneyebilirsin. İsterseniz diseksiyon bile yapabilirsiniz.

İlk amacınız hatanın kodunuzda neden olduğunu anlamaktır . Başlangıçta düzeltmeye çalışmayın. Sadece anlamaya çalışın . Anlamadan düzeltmeye çalışırsanız, hacklenecek ve çözseniz bile büyük olasılıkla teknik borç getireceksiniz .

Uygulamanın davranışları, satır satır. Değişken değerlerini izleyin. Kontrol akışını izleyin. Davranış ilk önce anlayışınızın olması gerektiğini söylediklerinden sapıyor? İşletim sisteminin etkinlikleri uygulamanıza nasıl gönderdiğini anlıyor musunuz? Eğer "kara kutu" probleminden etkileniyorsanız, derlenmiş kitaplıkların / çerçevelerin kaynağını alıp, gerektiğinde daha derin bir aşamada ilerlemenizi sağlayabilir misiniz?

Sürüm kontrol sisteminizde bu hatayı üretmeyen bir taahhüdünüz var mı? (Sürüm kontrolü kullanıyorsunuz değil mi?) Böyle bir taahhüdünüz varsa, hatanın tam olarak nerede sunulduğunu bulmak için geçmişte ikili bir arama yapabilirsiniz.

Hedefleriniz (1) anlamak - nedenini belirlemek ve bu amaçla, (2) uygulama davranışını ayrıntılı olarak anlamak, anlamak (3) sorunu ortadan kaldırarak ve daha sonra bunu yapmanı sağladım

Ama gerçekten sıkışıp kalırsanız kesinlikle haftalarca orada oturmayın. Kuruluşunuzdaki birine de söylemelisiniz. Mümkün olduğu durumlarda yardım isteyin ve belirli bir noktayı geçtikten sonra, yönetime ilerlemek için bir engele çarptığınızı hissettiğinizi söylemek kesinlikle size görevlidir. Ancak, hepsi öğrenme ve anlama üzerine odaklanan bir dizi farklı açıdan vurursanız bunu çözebilirsiniz.

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.