Mogłem dobrze zrozumieć ten problem w obszarach, w których obejmuje się każdy cal sprzętu, takich jak wielowątkowy silnik gry AAA nowej generacji, który wykorzystuje każdy rdzeń procesora, elementy wewnętrzne SIMD, GPU, GPGPU itp., Zapewniając jednocześnie platformę wieloplatformową produkt.
W takich przypadkach najgorszym koszmarem często są te przypadki, w których testy (jednostka i integracja) przejdą pierwsze 5000 przetestowanych odmiennych maszyn / platform, ale nie powiodło się w przypadku 5001 z powodu błędu sterownika dla niejasnego modelu GPU. o tym daje mi dreszcze - nie można tego wcześniej przetestować ani przewidzieć.
Zwłaszcza, jeśli napiszesz shadery GPU, możesz skończyć grać w loterię zwrotną, w której połowa pisanego kodu wywoła niezdefiniowane zachowanie, ponieważ istnieje niewiele przenośnych standardowych gwarancji egzekwowanych przez wszystkie zaangażowane modele / sterowniki GPU. Choć w dzisiejszych czasach gra staje się coraz mniej podobna do minesweepera, powinno to dać ludziom pewien pomysł: http://theorangeduck.com/page/writing-portable-opengl . Próbowanie tego na przełomie lat 90. i 2000. było naprawdę okropne i przez cały czas był trałowcem.
W tego rodzaju przypadkach często potrzebujesz zespołów ponad 10 000 testerów z naprawdę szeroką gamą sprzętu i systemów operacyjnych, aby naprawdę zestalić produkt i mieć pewność co do niego przed stabilnym wydaniem. Nie wszystkie firmy mogą sobie pozwolić na tak szeroką bazę testową i nie wszystkie mają dyscyplinę, aby zrobić to dobrze (wszystkie szeroko zauważalne problemy powinny zostać naprawione, zanim tylu testerów znajdzie się na jakimś wewnętrznym etapie pre-alfa / alfa lub zalew zbędnych raportów może wpędzić programistów w panikę polegającą na łataniu i modleniu się).
W tym przypadku polecam to, co sugerują inni, skup się na rozproszonym zestawie testów integracyjnych. Możesz połączyć to z instalatorem, wymagając od użytkowników, aby przeszli podstawowe testy diagnostyczne ze szczególną uwagą podając szczegóły, dlaczego instalacja nie powiedzie się, że mogą przekazać ci, deweloperzy.
Kolejną rzeczą (jeśli możesz przekonać szefa) jest posiadanie szerokiej gamy sprzętu do ciągłej integracji. Im większa różnorodność kombinacji sprzętowo-systemowych, tym lepiej. Potrzebujesz nawet różnego rodzaju badziewnego sprzętu, który modeluje minimalne wymagania sprzętowe dla serwerów CI: nigdy nie wiesz.
Ale sugeruję jeszcze jedną rzecz:
Logowanie
Jeśli masz do czynienia ze scenariuszem opisanym powyżej, często nie możesz przetestować tych rzeczy, które wydają się być najbardziej problematyczne (te najgorsze możliwe problemy, które pojawiają się w najgorszym możliwym czasie i nie mogą pojawić się nawet w najbardziej wyczerpujący zestaw testów, ponieważ jest to problem ograniczony do bardzo specyficznego zestawu sprzętu / systemu operacyjnego).
Jednak większość tego rodzaju problemów, takich jak niejasne niezgodności sprzętowe lub jawne usterki sterowników lub powiązanie z niewłaściwą dylib (nigdy tak naprawdę nie spotkałem się z tym problemem), nie pozwoli Ci daleko uruchomić oprogramowanie. Zwykle wkrótce się rozbije i spłonie, mówiąc nieuprzejmie.
Polecam, ze względu na zdrowie psychiczne, przyjąć coś nieuniknionego. Nie możesz nic zrobić z tymi rzeczami, nie możesz przetestować kompleksowo. Nie próbuj powstrzymywać huraganu (niemożliwe), ale wejdź na pokład tych okien.
Zazwyczaj najlepszą rzeczą, jaką możemy zrobić, jest jak najszybsze wykrycie problemu, w którym występuje on tak szczegółowo, jak to możliwe (zawężenie naszej listy podejrzanych), i zgłoszenie problemu jak najszybciej.
W takim przypadku rejestracja może uratować życie. Dla tego rodzaju pól możesz utworzyć spamerskie dzienniki techniczne, których nikt nigdy nie przeczytałby. Często istotny jest tylko ostatni wiersz zapisany w dzienniku, zanim użytkownik spotkał się z awarią spowodowaną usterką sterownika, np. Możesz napisać proces zewnętrzny lub zaczep, który monitoruje awarie, a następnie pokazuje ostatnią linię dziennika, którą użytkownicy mogą skopiować i wklej do ciebie, np. oprócz zrzutu awaryjnego.
Ponieważ często wymaga to szczegółowych informacji, a wiele najbardziej podatnych obszarów w kodzie na problemy związane ze sprzętem / platformą / sterownikami ma krytyczne znaczenie dla wydajności, istnieje ten dziwny problem, w którym rejestrowanie może odbywać się z taką częstotliwością, że faktycznie spowalnia w dół oprogramowania.
Przydatną sztuczką w tym przypadku jest poleganie na założeniu, że raz wykonane coś wykona się pomyślnie za drugim razem, za trzecim razem itp. To nie jest najbardziej rozsądne założenie, ale często jest „wystarczająco dobre” (i nieskończenie lepsze niż nic) . Dzięki temu możesz użyć odrobiny stanu zewnętrznego, aby śledzić, kiedy coś zostało już zarejestrowane i pominąć kolejne próby logowania w tych naprawdę szczegółowych przypadkach, w których kod będzie wywoływany wielokrotnie w pętli.
W każdym razie mam nadzieję, że to pomoże. W przeszłości miałem taką pokusę i miałem paranoję związaną z kodowaniem GPU (GPGPU i shadery) w wyniku wcześniejszych doświadczeń między mną i moim zespołem (czasami po prostu widząc, jak inni członkowie zespołu sobie z tym radzą Późne i po wydaniu dały mi dreszcze, jak niektóre usterki ATI na konkretnym modelu Radeona, które zawieszałyby się podczas renderowania linii antyaliasingowych, później zgłoszonych i oznaczonych jako znany problem z dostępnym rozwiązaniem obejścia).
Zapisywanie było tym, co uratowało nam tyłki, pozwalając nam często zobaczyć problem na tej 10,111 mało znanej prototypowej maszynie z wbudowanym procesorem graficznym, o której nigdy nie słyszeliśmy, a ostatni wiersz kodu natychmiast pozwala nam zlokalizować dokładnie, gdzie awaria spadła do 2 lub 3 wiersze kodu jako podejrzane, np. jeśli znajduje się w skomplikowanym module cieniującym, jesteśmy w pewnym sensie SOL, ponieważ nie możemy zalogować się w module cieniującym GPU, ale możemy przynajmniej użyć rejestrowania, aby sprawdzić, który moduł cieniujący miał problem od razu rozpocząć dochodzenie.