Wysłałeś, masz rzadką usterkę seg. Sprawdzanie wskaźnika czy odpuścić?

9

Wysłano, twierdzenia są wyłączone, otrzymujesz rzadki raport o awarii wskazujący, że w kodzie wystąpiło naruszenie wskaźnika zerowego W środowisku programistycznym problem zostałby wychwycony przez aser.

Wszystko, co masz, to raport o awarii, więc odtworzenie problemu jest prawie niemożliwe. Podążanie śladami wstecznymi nie daje żadnych wskazówek, dlaczego awaria miała miejsce w pierwszej kolejności.

Opcje: - Dodaj sprawdzanie wskaźnika, aby zapobiec awarii. Zapobiegnie to awarii, ale prawdopodobnie nawet nie dowiesz się, dlaczego tak się stało. - pozwól mu latać, mam nadzieję, że powtórzy się to ze scenariuszem repro

Powiedzmy, że aplikacja nie jest przeznaczona dla pocisku kierowanego lub automatycznego układu hamulcowego ...

Które byś wybrał?

MM01
źródło
Jeśli nie jest to poprawne, przydatne może być opublikowanie raportu o awarii wraz z odpowiednimi plikami kodu (być może na Pastebin.com) na stronie stosu przepełnienia, jeśli chcesz to rozwiązać ...
Tamara Wijsman
2
@TomWij: Nie myśl tak ... najprawdopodobniej zostanie zamknięty jako „zbyt lokalny”
Naveen
@Naveen: Może ... Nie jestem regularnym gościem SO, więc był to komentarz SU-mind.
Tamara Wijsman,
1
@Naveen: Zbyt zlokalizowany oznacza zbyt regionalny, dotyczy geografii, a nie specjalizacji problemu. Ale to pytanie prawdopodobnie zostanie zamknięte na temat SO przez podmiotowość.
Maniero

Odpowiedzi:

7

Wybrałem drugie podejście. Nie ma sensu ukrywać awarii, jeśli wskaźnik NULL był nieoczekiwany w miejscu, w którym nastąpiła awaria. Ten wskaźnik NULL w większości przypadków byłby tylko jednym z symptomów, że coś innego jest nie tak. Jeśli ukryjemy go za pomocą wskaźnika NULL, jest prawie pewne, że coś innego się zepsuje. Wydaje mi się, że masz większą szansę na uchwycenie scenariusza, jeśli znasz punkt, w którym ulega awarii za każdym razem zamiast w losowym miejscu.

Naveen
źródło
1
Skłaniam się ku tej opinii. Martwi mnie postrzeganie użytkownika. Awaria wyraźnie wygląda, jakby coś poszło nie tak. Jeśli jednak funkcja zostanie źle obliczona, zostanie to również zauważone.
MM01
2
Moim zdaniem, nawet jeśli użytkownik może być poirytowany sporadyczną awarią, bardzo się zdenerwuje, jeśli da zły wynik, ponieważ może pozostać niezauważony.
Naveen,
awarii tak wcześnie, jak to możliwe, pomaga znaleźć problem i pomaga użytkownikowi stracić mniej danych
Spudd86,
również użyłbym valgrind, aby dowiedzieć się, co robię źle (lub przynajmniej spróbowałbym, w każdym razie może znaleźć pewne problemy, które należy naprawić) Dodałbym dodatkowe zapewnienia, aby spróbować złapać wskaźnik NULL wcześniej i poproś użytkownika, aby spróbował uruchomić kompilację z włączonymi
asertami
3
  1. Jak często zdarza się awaria? Zdarza się to tylko jednemu z wielu klientów w jakiejś niejasnej sprawie? Jakie są konsekwencje (utrata danych, awaria systemu)? Jeśli zdarza się to raz na milion przypadków, a oni po prostu muszą zrestartować aplikację i żadne dane nie zostaną utracone, to prawdopodobnie nie trzeba tego naprawiać - zostaw to w ten sposób.

  2. Jak drogie (pieniądze i czas) jest dodawanie twierdzeń i wysyłanie ich do wszystkich klientów (jeśli tylko część klientów otrzyma nową wersję, to reszta może dostać się do problemu nie sprawdzonego zerowego)? Jakie są szanse na znalezienie problemu? Jeśli po prostu umieścisz losowe kontrole w kodzie w celu wykrycia błędu, jest to zła praktyka ...

  3. Czy problem można odtworzyć na komputerze klienta? Czy możesz uzyskać dostęp do tego komputera? To może być naprawdę cenne

  4. Przejrzyj raporty o awariach i upewnij się, że podane informacje są przydatne i mogą pomóc w zdiagnozowaniu problemu

Victor Hurdugaci
źródło
2

W środowisku programistycznym problem zostałby wychwycony przez aser.

W określonej kolejności zostałby złapany i naprawiony, ale bieżący ślad nigdy nie został złapany.
Powinieneś być w stanie zobaczyć, co poszło nie tak ze zrzutem awaryjnym, czy sprawdziłeś parametry itp.?

Dodatki, które można wykonać na podstawie czasu, który chcesz w to poświęcić:

  • Zarchiwizuj zrzut awaryjny i odnieś się do niego w kodzie z komentarzem do linii, w
    której się zawiesił , dzięki czemu osoba, która bada bardzo podobny zrzut pamięci, wie, że zdarzyło się to przed ...
    [czas spędzony: krótki]

  • Dodatkowe kontrole, logowanie, ... Chcesz temu zapobiec i uzyskać więcej informacji następnym razem.
    [spędzony czas: średni]

    W kodzie wystąpiło naruszenie wskaźnika zerowego.

  • Sprawdź, czy niemożliwe jest wywołanie aplikacji w taki sposób, aby doszło do tego naruszenia.
    [czas spędzony: długi]

Tamara Wijsman
źródło
1
W tym poście nie chodzi o podejście do rozwiązania problemu, ale raczej o sposób działania w hipotetycznej sytuacji (tzn. W przydzielonym czasie nie można było wydedukować źródła problemu).
MM01
2

Obecnie wysyłam z włączoną funkcją assert (). Nie kosztuje dużo i może znacznie ułatwić życie w nieprzyjaznych sytuacjach (tj. Środowiska klienta są często bardziej wrogie niż środowiska deweloperów lub kontroli jakości).

Mitch Haile
źródło