Ich verstehe diese Besorgnis sehr gut in Bereichen, in denen Sie jeden einzelnen Zentimeter der Hardware abdecken, wie z. B. eine Multithread-AAA-Game-Engine der nächsten Generation, die jeden einzelnen CPU-Kern, SIMD-Intrinsics, GPU, GPGPU usw. verwendet und gleichzeitig eine plattformübergreifende Lösung bereitstellt Produkt.
In diesen Fällen ist der schlimmste Albtraum häufig der, in dem Ihre Tests (Einheit und Integration) für die ersten 5.000 getesteten Maschinen / Plattformen bestanden werden, aber für die 5.001 aufgrund eines Treiberfehlers für ein undurchsichtiges GPU-Modell fehlschlagen darüber zittere ich - das kann man unmöglich im voraus testen oder vorhersehen.
Insbesondere wenn Sie GPU-Shader schreiben, können Sie eine umgekehrte Lotterie spielen, bei der der halbe Code, den Sie schreiben, undefiniertes Verhalten hervorruft, da es nur wenige tragbare Standardgarantien gibt, die von allen beteiligten GPU-Modellen / Treibern durchgesetzt werden. Obwohl es heutzutage immer weniger so aussieht wie Minensuchboot zu spielen, sollte dies den Leuten eine Idee geben: http://theorangeduck.com/page/writing-portable-opengl . Dies in den späten 90ern und frühen 2000ern zu versuchen war wirklich schrecklich und es war Minensuchboot den ganzen Weg.
Für diese Art von Fällen benötigen Sie häufig Teams mit mehr als 10.000 Testern mit einem breiten Palette von Hardware und Betriebssystemen , um wirklich das Produkt erstarren und darüber vor einem stabilen Release sicher zu fühlen. Nicht alle Unternehmen können es sich leisten, eine so breite Testbasis zu haben, und nicht alle haben die Disziplin, es richtig zu machen (alle allgemein wahrnehmbaren Probleme sollten behoben werden, bevor so viele Tester in einer internen Pre-Alpha / Alpha-Phase oder anderswo sind Eine Flut redundanter Berichte kann Entwickler in Panik versetzen.
Was ich in diesem Fall empfehle, ist das, was andere vorgeschlagen haben. Konzentrieren Sie sich auf verteilte Integrationstests. Sie können es mit dem Installationsprogramm bündeln. Die Benutzer müssen eine grundlegende Diagnoseprüfung durchführen und dabei sorgfältig prüfen, ob die Installation fehlgeschlagen ist. Diese Prüfung kann an Sie als Entwickler weitergegeben werden.
Eine andere Sache (wenn Sie den Chef überzeugen können) ist, eine breite Palette von Hardware zur Verfügung zu haben, um eine zusammenhängende Integration durchzuführen. Je mehr Hardware / Betriebssystem-Kombinationen zur Auswahl stehen, desto besser. Sie möchten sogar eine Vielzahl von Misthardware, die die minimalen Hardwareanforderungen für Ihre CI-Server modelliert: Sie wissen es nie.
Aber noch etwas würde ich vorschlagen:
Protokollierung
Wenn Sie es mit etwas wie dem oben beschriebenen Szenario zu tun haben, können Sie oft nicht auf diese Dinge testen, die in der Regel am problematischsten sind (diese schlimmsten Fälle, die zum schlimmsten Zeitpunkt auftreten und nicht einmal im Szenario auftreten können) umfassendste Testsuite, da es sich um ein Problem handelt, das auf eine bestimmte Hardware / Betriebssystem-Kombination beschränkt ist).
Die meisten dieser Probleme, wie obskure Hardware-Inkompatibilitäten oder regelrechte Treiberfehler oder das Verknüpfen mit der falschen Dylib (ich habe mich dieser Sorge nie gestellt), bringen Sie jedoch nicht weit über das Starten der Software hinaus. Es wird normalerweise ziemlich bald abstürzen und brennen, grob gesagt.
Ich empfehle aus Gründen der Vernunft, das Unvermeidliche zu umarmen. Sie können unmöglich etwas gegen diese Dinge unternehmen, die Sie möglicherweise nicht umfassend testen können. Versuchen Sie nicht, den Hurrikan zu verhindern (unmöglich), sondern steigen Sie in diese Fenster.
In der Regel können wir das Problem so schnell wie möglich herausfinden, wo es so detailliert wie möglich auftritt (um die Liste der Verdächtigen einzugrenzen), und das Problem so schnell wie möglich beheben lassen, nachdem es gemeldet wurde.
In diesem Fall kann die Protokollierung ein Lebensretter sein. Für diese Art von Feldern können Sie diese technischen Spam-Protokolle erstellen, die niemand jemals durchlesen würde. Häufig ist nur die allerletzte Zeile des Protokolls relevant, die aufgezeichnet wurde, bevor der Benutzer aufgrund eines Treiberfehlers einem Absturz ausgesetzt war. Sie können z. B. einen externen Prozess oder Hook schreiben, der auf Abstürze überwacht und dann die letzte Zeile des Protokolls anzeigt, die Benutzer kopieren können und einfügen, zB zusätzlich zu einem Crash Dump.
Da dies häufig detaillierte Informationen erfordert und viele der anfälligsten Bereiche im Code für diese Hardware-, Plattform- und Treiberprobleme leistungskritisch sind, gibt es dieses unangenehme Problem, bei dem die Protokollierung mit einer solchen Häufigkeit erfolgen kann, dass sie tatsächlich langsamer wird Runter die Software.
Ein nützlicher Trick in diesem Fall ist, sich auf die Annahme zu verlassen, dass etwas, das einmal ausgeführt wird, beim zweiten, dritten Mal usw. erfolgreich ausgeführt wird. Dies ist nicht die fundierteste Annahme, aber es ist oft "gut genug" (und unendlich besser als nichts). . Auf diese Weise können Sie ein wenig externen Status verwenden, um zu verfolgen, wann etwas bereits protokolliert wurde, und nachfolgende Versuche zu überspringen, in denen der Code in einer Schleife wiederholt aufgerufen wird.
Wie auch immer, ich hoffe das hilft. Ich bin in der Vergangenheit auf diese Art von Versuchung gestoßen und habe eine gewisse Paranoia in Bezug auf die GPU-Codierung (GPGPU und Shader) als Ergebnis einiger Erfahrungen zwischen mir und meinem Team (manchmal nur, wenn andere Teammitglieder sich wirklich damit befassen) Verspätung und Nachveröffentlichung machten mir zu schaffen, wie ein ATI-Fehler bei einem bestimmten Radeon-Modell, der beim Rendern von Antialias-Linien zum Absturz führte. Dies wurde später gemeldet und als bekanntes Problem markiert, da nur eine Problemumgehungslösung zur Verfügung stand.
Das Protokollieren rettete uns die Nerven, sodass wir oft das Problem auf dieser 10.001. obskuren Prototypmaschine mit einer integrierten GPU sehen konnten, von der wir noch nie gehört hatten. Mit der letzten Codezeile konnten wir sofort feststellen, wo genau der Fehler aufgetreten war oder 3 Codezeilen als Verdächtiger, zB Wenn es sich um einen aufwändigen Shader handelt, sind wir eine Art SOL, da wir in einem GPU-Shader keine Protokollierung durchführen können, aber wir können die Protokollierung zumindest verwenden, um zu sehen, bei welchem Shader das Problem sofort aufgetreten ist die Untersuchung zu starten.