Jak podchodzisz sporadyczne błędy?

głosy
31

Scenariusz

Masz kilka raportów o błędach wszystkie pokazujące ten sam problem. Oni wszyscy tajemnicze z podobnymi opowieściami, jak pojawił się problem. Wykonać czynności, ale nie wiarygodnie odtworzyć problem. Po pewnym dochodzenia i przeszukiwania stron internetowych, można podejrzewać, co może się dziać i jesteś pewien, że można go naprawić.

Problem

Niestety, bez wiarygodnego sposobu odtworzenia pierwotnego problemu, nie można sprawdzić, czy rzeczywiście rozwiązuje problem zamiast żadnego wpływu w ogóle lub zaostrza i maskowanie rzeczywistego problemu. Po prostu nie mogli go naprawić, aż staje się powtarzalna za każdym razem, ale jest to duży błąd i nie ustalające spowodowałoby to użytkownikom wiele innych problemów.

Pytanie

Jak idziesz na temat weryfikacji zmiany?

Myślę, że jest to bardzo znany scenariusz do każdego, kto inżynierii oprogramowania, więc jestem pewien, że istnieje mnóstwo rozwiązań i najlepszych praktyk w celu przeciwdziałania błędy jak ten. Obecnie poszukujemy w jednym z tych problemów w naszym projekcie, gdzie spędziłem trochę czasu określenia problemu, ale nie byli w stanie potwierdzić moje podejrzenia. Kolega jest moczyć testowania moją poprawkę w nadziei, że „dzień pracuje bez awarii” równa się „to stałe”. Jednak wolałbym bardziej niezawodne podejście i pomyślałem, że to bogate doświadczenie tutaj na SO.

Utwórz 09/12/2008 o 15:31
źródło użytkownik
W innych językach...                            


18 odpowiedzi

głosy
12

Błędy, które są trudne do odtworzenia są najtrudniejsze jeden rozwiązać. Co trzeba upewnić się, że trzeba znaleźć źródło problemu, nawet jeśli sam problem nie może być powielana pomyślnie.

Najczęstszymi przerywany błędy są spowodowane warunkach wyścigowych - dzięki wyeliminowaniu wyścig, lub zapewnienie, że jedna strona zawsze wygrywa masz wyeliminować źródło problemu, nawet jeśli nie można skutecznie potwierdzić poprzez badanie wyników. Jedyną rzeczą, którą można przetestować to, że przyczyną nie musi powtarzać.

Czasami ustalenie, co jest postrzegane jako korzeń rzeczywiście rozwiązuje problem, ale nie po prawej jeden - nie ma uniknięcia go. Najlepszym sposobem na uniknięcie sporadyczne błędy, to być ostrożny i metodyczny w zakresie projektowania i architektury systemu.

Odpowiedział 09/12/2008 o 15:40
źródło użytkownik

głosy
7

Nigdy nie będziesz w stanie zweryfikować poprawkę bez identyfikacji przyczyny i wymyślanie niezawodny sposób, aby odtworzyć błąd.

Identyfikacji przyczyny: Jeżeli platforma pozwala na to, hak trochę poubojowe debugowanie do problemu.

Na przykład w systemie Windows, dostać kod, aby utworzyć plik miniaturowy zrzut (rdzeń zrzutu na Unix), gdy napotka ten problem. Następnie można dostać klientowi (lub WinQual w systemie Windows), aby wysłać ten plik. To powinno dać Ci więcej informacji o tym, jak Twój kod poszło nie tak w systemie produkcyjnym.

Ale bez tego, to trzeba jeszcze wymyślić wiarygodny sposób, aby odtworzyć błąd. W przeciwnym razie nigdy nie będziesz w stanie sprawdzić, czy problem został rozwiązany.

Nawet z wszystkich tych informacji, może skończyć się mocowania błąd, który wygląda, ale nie jest ten, który klient widzi.

Odpowiedział 09/12/2008 o 15:40
źródło użytkownik

głosy
5

Używam co ja nazywam „ciężki styl programowanie defensywne” : dodaj twierdzi we wszystkich modułach, które wydaje się być związany przez problem. Chodzi mi o to, dodać dużo twierdzi , twierdzi dowody, dochodzić stan obiektów we wszystkich swoich memebers, dochodzić „Environnement” stan, etc.

Twierdzi pomóc zidentyfikować kod, który nie jest związany z problemem.

Większość czasu i znaleźć źródło problemu po prostu pisząc twierdzenia, gdyż zmusza do ponownego odczytania cały kod i plundge pod wnętrzności aplikacji, aby ją zrozumieć.

Odpowiedział 09/12/2008 o 15:47
źródło użytkownik

głosy
5

Instrument kompilacja z bardziej rozległej (ewentualnie opcjonalnie) rejestrowania i zapisywania danych, który umożliwia dokładne odwzorowanie zmiennej UI kroki użytkownicy wziął przed wystąpieniem awarii.

Jeśli te dane nie pozwalają wiarygodnie odtworzyć problem to masz zawężony klasę błędu. Czas spojrzeć na źródła losowej zachowań, takich jak zmiany w konfiguracji systemu, porównaniem wskaźnik, danych itp niezainicjowanych

Czasem trzeba „wiedzieć” (lub raczej czuć), że można rozwiązać ten problem bez szeroko zakrojonych badań lub testów jednostkowych rusztowania, bo naprawdę zrozumieć problem. Jeśli jednak nie, to bardzo często sprowadza się do czegoś jak „Pobiegliśmy go 100 razy, a błąd nie wystąpił, więc uważamy, że stała aż do następnego razu to zgłoszone.”.

Odpowiedział 09/12/2008 o 15:39
źródło użytkownik

głosy
4

Nie ma jednej odpowiedzi na ten problem. Czasami rozwiązanie znalazłeś pomaga zorientować się w scenariusz do odtworzenia problemu, w takim przypadku można przetestować ten scenariusz przed i po poprawce. Zdarza się jednak, że rozwiązanie znalazłeś tylko rozwiązuje jeden z problemów, ale nie wszystkie z nich, albo jak mówisz maski głębszy problem. Chciałbym móc powiedzieć „to zrobić, to działa za każdym razem”, ale nie jest „to”, które pasuje do tego scenariusza.

Odpowiedział 09/12/2008 o 15:39
źródło użytkownik

głosy
2

Mówisz, że w komentarzu, że uważasz, że jest to sytuacja wyścigu. Jeśli myślisz, że wiesz, co „cecha” kodu jest generowanie warunek, można napisać test, aby spróbować go zmusić.

Oto niektóre ryzykowne kodu w C:

const int NITER = 1000;
int thread_unsafe_count = 0;
int thread_unsafe_tracker = 0;

void* thread_unsafe_plus(void *a){
  int i, local;
  thread_unsafe_tracker++;
  for (i=0; i<NITER; i++){
    local = thread_unsafe_count;
    local++;
    thread_unsafe_count+=local;
  };
}
void* thread_unsafe_minus(void *a){
  int i, local;
  thread_unsafe_tracker--;
  for (i=0; i<NITER; i++){
    local = thread_unsafe_count;
    local--;
    thread_unsafe_count+=local;
  };
}

który można przetestować (w enironment Pthreads) gdzie:

pthread_t th1, th2;
pthread_create(&th1,NULL,&thread_unsafe_plus,NULL);
pthread_create(&th2,NULL,&thread_unsafe_minus,NULL);
pthread_join(th1,NULL);
pthread_join(th2,NULL);
if (thread_unsafe_count != 0) {
  printf("Ah ha!\n");
}

W prawdziwym życiu, prawdopodobnie będziesz musiał owinąć podejrzanego kodu w jakiś sposób pomóc wyścig trafienie więcej ofter.

Jeśli to działa, dostosować liczbę wątków i innych parametrów, które sprawiają, że hit większość czasu, a teraz masz szansę.

Odpowiedział 09/12/2008 o 18:24
źródło użytkownik

głosy
2

Najpierw trzeba dostać ślady stosu z klientami, w ten sposób można rzeczywiście zrobić kilka śledczej.

Następny zrobić testy Fuzz z wejściem losowej, a utrzymanie tych testów uruchomionych na długich odcinkach, są świetne w znalezieniu tych irracjonalnych skrajne przypadki, że programiści i testerzy człowieka może znaleźć poprzez przypadkach i zrozumienie kodu w ruchu.

Odpowiedział 09/12/2008 o 15:48
źródło użytkownik

głosy
1

Zabrakło mi do błędów w systemach, które wydają się konsekwentnie powodować błędy, ale kiedy intensywniejszej poprzez kod w debuggera problem znika w tajemniczych okolicznościach. We wszystkich tych przypadkach kwestia była jednym z terminów.

Gdy system został uruchomiony normalnie tam był jakiś konflikt o zasoby lub następny krok przed ostatnia zakończona. Kiedy wszedł przez nią w debugger, rzeczy poruszały się na tyle wolno, że problem zniknął.

Kiedy już zorientowali się, że to kwestia rozrządu łatwo było znaleźć poprawkę. Nie jestem pewien, czy to ma zastosowanie w danej sytuacji, ale gdy błędy znikają w debugger kwestie czasowe są moimi pierwszymi podejrzanymi.

Odpowiedział 09/12/2008 o 18:32
źródło użytkownik

głosy
1

Dla trudnych do powielać błędów, pierwszym krokiem jest zwykle dokumentacja. W obszarze kodu, który się niepowodzeniem, należy zmodyfikować kod, aby być hiper-wyraźne: Jedno polecenie na linię; ciężkie zróżnicowane obsługi wyjątków; gadatliwy, nawet PROLIX wyjście debugowania. W ten sposób, nawet jeśli nie można odtworzyć lub naprawić błąd, można uzyskać znacznie więcej informacji o przyczynie następnym razem porażka jest postrzegana.

Drugim krokiem jest zwykle twierdzenie założeń i sprawdzanie ograniczeń. Wszystko, co myślisz, że wiesz o kodzie w pytaniu napisać .Asserts i kontrole. W szczególności należy sprawdzić obiekty o stwierdzenie nieważności i (jeśli język jest dynamiczny) istnienia.

Po trzecie, należy sprawdzić zasięg testów jednostkowych. Czy twoje testy jednostkowe faktycznie obejmuje każdy widelec w realizacji? Jeśli nie masz testów jednostkowych, to jest dobrym miejscem, aby rozpocząć.

Problem z błędami unreproducible jest to, że są one unreproducible tylko do autora. Jeśli użytkownicy końcowi nalegać na ich powielanie, że to cenne narzędzie wykorzystać katastrofę w tej dziedzinie.

Odpowiedział 09/12/2008 o 18:19
źródło użytkownik

głosy
1

specyficzny scenariusz

Chociaż nie chcę się skupić tylko na tej kwestii mam, oto kilka szczegółów z aktualnego wydania mamy do czynienia i jak mam rozwiązać go tak daleko.

Problem pojawia się, gdy użytkownik komunikuje się z interfejsem użytkownika (TabControl być dokładnie) w danym etapie procesu. To nie zawsze występują i wierzę, że to dlatego, że okno od czasu do problemu być wystawiony jest niewielka. Podejrzewam, że inicjalizacja UserControl (jesteśmy w .NET, C #) zbiega się z przypadku zmiany stanu z innego obszaru aplikacji, która prowadzi do czcionki są umieszczone. Tymczasem kolejna kontrola (Label) próbuje wyciągnąć swój ciąg z tą czcionką, a zatem zderzenia.

Jednak faktycznie potwierdzając to, co prowadzi do czcionki są umieszczone okazało się trudne. Obecna poprawka została do sklonowania czcionkę tak, że etykieta rysunek wciąż ma ważny czcionkę, ale to naprawdę maskuje problemowe korzeń, który jest czcionka jest umieszczony w pierwszej kolejności. Oczywiście, chciałbym, aby wyśledzić pełną sekwencję, ale okazuje się bardzo trudne, a czas jest krótki.

Podejście

Moje podejście było najpierw spojrzeć na ślad stosu z naszych raportów o awariach i zbadać kod Microsoft przy użyciu reflektor. Niestety, doprowadziło to do GDI + zadzwonić z małym dokumentacji, która zwraca tylko numer do błędu - NET to okazuje się całkiem bezużyteczne wiadomości wskazującej coś jest nieprawidłowy. Wspaniały.

Stamtąd poszedłem sprawdzić, co wezwanie w naszym kodzie prowadzi do tego problemu. Stos rozpoczyna pętlę komunikatów, a nie w naszym kodzie, ale znalazłem wezwanie do update () w ogólnej powierzchni pod podejrzenia i stosując oprzyrządowanie (ślady itp), byliśmy w stanie potwierdzić, do około 75% pewności, że ta był źródłem wiadomości farby. Jednak to nie był źródłem błędu - prosząc wytwórnię do malowania ma przestępstwa.

Stamtąd, spojrzałem w każdym aspekcie rozmowy farby, która została awarii (sznurkiem), aby zobaczyć, co może być nieważny i zaczął rządzić każdy się aż padł na jednorazowych przedmiotów. Następnie określa się, które z nich mieliśmy kontroli nad i czcionka była tylko jedna. Więc przyjrzał się, jak obchodzić czcionkę iw jakich okolicznościach możemy wyrzucać go zidentyfikować potencjalne przyczyny. Udało mi się wymyślić wiarygodny sekwencji zdarzeń, które pasują raporty od użytkowników, a zatem w stanie zakodować małą poprawkę ryzyka.

Oczywiście, to przyszło mi do głowy, że błąd był w ramach, ale podoba mi się zakładać, że wkręca się przed przejściem winę na Microsoft.

Wniosek

Tak, to w jaki sposób podchodzić Szczególnym przykładem tego rodzaju problemu. Jak widać, jest to dalekie od ideału, ale pasuje do tego, co wielu z nich powiedział.

Odpowiedział 09/12/2008 o 16:21
źródło użytkownik

głosy
1

Są straszne i prawie zawsze odporne na „poprawki” inżynier myśli, że jest wprowadzenie, jak mają w zwyczaju wracać do bite miesiące później. Wystrzegaj się wszelkich poprawek wprowadzonych do sporadycznych błędów. Bądź przygotowany na trochę nieprzyjemną pracę i intensywnego wyrębu jak brzmi to większy problem niż badania problemu rozwoju.

Mój własny problem podczas pokonywania błędów Takie było to, że był często zbyt blisko do problemu, nie stoi tyłem i patrząc na większy obraz. Spróbuj dostać kogoś innego spojrzenia na jak podejść do problemu.

Konkretnie mój błąd było zrobić z ustawieniem limitu czasu i różnych innych magicznych liczb, które z perspektywy czasu, gdzie granica i tak pracował prawie cały czas. Sztuką w moim przypadku było zrobić wiele eksperymentów z ustawieniami, że mogę dowiedzieć się, jakie wartości będzie „przerwa” oprogramowanie.

Czy awarie zdarzyć w określonych przedziałach czasowych? Jeśli tak, to gdzie i kiedy? Czy to tylko niektóre osoby, które zdają się odtworzyć błąd? Co zestaw wejść zdają się zapraszać problem? Jaka część aplikacji to nie on? Czy pluskwa wydaje się bardziej lub mniej przerywany w tej dziedzinie?

Kiedy byłem tester oprogramowania moje główne narzędzia gdzie pióro i papier, aby nagrywać notatki z moich poprzednich działań - pamiętają wiele pozornie nieistotnych szczegółów jest niezbędna. Obserwując i zbierając trochę bitów danych cały czas bug pojawi się mniej przerywany.

Odpowiedział 09/12/2008 o 16:17
źródło użytkownik

głosy
1

Niektóre pytania można zadać sobie pytanie:

  • Kiedy to kawałek kodu ostatnią pracę bez problemu.
  • Co zostało zrobione, ponieważ przestał działać.

Jeśli kod nigdy nie pracował podejście byłoby naturalnie inna.

Przynajmniej kiedy wielu użytkowników zmienia dużo kodu cały czas jest to bardzo powszechny scenariusz.

Odpowiedział 09/12/2008 o 15:53
źródło użytkownik

głosy
1

W tej sytuacji, gdzie nic innego nie działa, mogę przedstawić dodatkowego logowania.

Dodam również w powiadomieniach e-mail, które pokazują mi stan aplikacji, gdy się zepsuje.

Czasem dodaję w liczników wydajności ... kładę, że dane w tabeli i spojrzeć na trendy.

Nawet jeśli nic nie pokazuje się, jesteś zwężenie rzeczy w dół. Tak czy inaczej, to będzie skończyć z przydatnych teorii.

Odpowiedział 09/12/2008 o 15:47
źródło użytkownik

głosy
1

Te rodzaje błędów są bardzo frustrujące. Ekstrapolować ją do różnych maszyn z różnymi rodzajami niestandardowego sprzętu, który może być w nich (podobnie jak w mojej firmie), a chłopiec och chłopiec ma stać się koszmarem. Obecnie mam kilka błędów, jak to w tej chwili w mojej pracy.

Moja zasada: nie naprawić go chyba mogę go odtworzyć sobie albo ja przedstawiane z dziennika, który wyraźnie pokazuje coś złego. W przeciwnym razie nie mogę zweryfikować zmiany, ani nie mogę sprawdzić, czy moja zmiana nie ma nic innego złamany. Oczywiście, to tylko zasada - I robią wyjątków.

Myślę, że masz rację, że są zainteresowani z podejściem Twojego colleuge użytkownika.

Odpowiedział 09/12/2008 o 15:44
źródło użytkownik

głosy
0

Po prostu: zwrócić się do użytkownika, który Poinformowano.

Ja po prostu użyć jednego z reporterów jako system weryfikacji. Zwykle osoba, która chciała zgłosić błąd jest bardziej niż szczęśliwi, aby pomóc rozwiązać jej problem [1]. Wystarczy dać jej wersję z ewentualnej poprawki i zapytać, czy problem zniknął. W przypadkach, gdy błąd jest regresja, ta sama metoda może być stosowana do przepoławiać gdzie wystąpił problem, dając użytkownikowi z problemem wielu wersjach testowych. W innych przypadkach użytkownik może również pomóc debugować problem, dając jej wersję z większą liczbą możliwości debugowania.

Pozwoli to na ograniczenie negatywnych skutków możliwych poprawki do tej osoby zamiast zgadywać, że coś będzie naprawić błąd, a później na sobie sprawę, że właśnie ukazała się „bug fix”, która nie ma wpływu lub w najgorszym przypadku negatywny wpływ na stabilność systemu.

Można również ograniczyć ewentualne negatywne skutki „bug fix”, dając nową wersję do ograniczonej liczby użytkowników (na przykład dla wszystkich tych, które zgłosiły problem) i zwalniając ustalić dopiero po tym.

Również te, ona może potwierdzić, że poprawka dokonaniu dzieła, łatwo jest dodać testy, które gwarantuje, że poprawka zostanie w kodzie (przynajmniej na poziomie testów jednostkowych, jeśli błąd jest trudny do odtworzenia na bardziej wyższym poziomie systemu ).

Oczywiście wymaga to, że cokolwiek pracują nad obsługuje ten rodzaj podejścia. Ale jeśli nie będę naprawdę robić, co mogę, aby ją włączyć - użytkownicy końcowi są bardziej zadowoleni, a wiele z najtrudniejszych problemów tech prostu odejść i priorytety są jasne, kiedy rozwój może bezpośrednio oddziaływać z użytkownikami końcowymi systemu.

[1] Jeśli kiedykolwiek zgłosił błąd, najprawdopodobniej wiedzieć, że wiele razy odpowiedź z deweloperami / konserwacji jest w jakiś sposób negatywny z punktu widzenia użytkowników końcowych widzenia lub nie będzie odpowiedzią na wszystko - zwłaszcza w sytuacjach, w których błąd nie może być powielana przez deweloperami.

Odpowiedział 05/09/2014 o 11:50
źródło użytkownik

głosy
0

Kiedy w pełni zrozumieć ten błąd (i to duże „raz”), powinieneś być w stanie odtworzyć go w dowolnym momencie. Gdy kod reprodukcji (zautomatyzowany test) jest napisane, to naprawić błąd.

Jak dostać się do punktu, w którym zrozumiesz błąd?

Instrument kod (log jak szalony). Pracować z QA - są dobre na ponowne tworzenie problem i trzeba zorganizować mieć pełny dev narzędzi do Państwa dyspozycji na swoich maszynach. Używać zautomatyzowanych narzędzi do niezainicjowanej pamięci / zasobów. Po prostu wpatrywać się w kodzie. Nie istnieje proste rozwiązanie.

Odpowiedział 09/12/2008 o 19:56
źródło użytkownik

głosy
0

Chyba że istnieją poważne ograniczenia czasowe, nie rozpocząć testowanie zmian dopóki mogę wiarygodnie odtworzyć problem.

Jeśli naprawdę musiał, przypuszczam, można napisać przypadek testowy, który pojawia się czasami powodować problem i dodać go do zautomatyzowanego zestawu testowego (ty masz zautomatyzowanego zestawu testowego, prawda?), A następnie dokonać zmian i nadziei że sprawdzian nigdy ponownie nie powiedzie się, wiedząc, że jeśli naprawdę nie naprawić coś przynajmniej masz teraz szansę na złapanie go. Ale do czasu można napisać przypadek testowy, prawie zawsze mają rzeczy obniżona do punktu, w którym już nie mamy do czynienia z taką sytuacją (podobno) nie deterministyczny.

Odpowiedział 09/12/2008 o 19:06
źródło użytkownik

głosy
0

Problemy te zawsze były spowodowane przez:

  1. Problemy z pamięcią
  2. Problemy Threading

Aby rozwiązać ten problem, należy:

  • Instrument kod (Dodaj oświadczenia dziennika)
  • Code Review gwintowania
  • Code Review alokacji pamięci / dereferencing

Opinie kod będzie najprawdopodobniej tylko wtedy, gdy jest to priorytet, lub jeśli masz silne podejrzenia o których kod jest współdzielony przez wielu raportów o błędach. Jeśli jest to problem gwintowania, a następnie sprawdzić swoje bezpieczeństwo wątek - uczynić zmienne pewność, że accessable przez obie nici są chronione. Jeśli jest to problem pamięci, a następnie sprawdzić swoje alokacje i dereferences a zwłaszcza być podejrzane kodu, który przydziela i wraca pamięć lub kod, który używa alokacji pamięci przez kogoś, kto może być jego zwolnieniem.

Odpowiedział 09/12/2008 o 15:47
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more