Wie man Teammitglieder von der Existenz eines "Mandelbugs" überzeugt

20

Wir entwickeln eine Anwendung. Es enthält eine Bibliothek, die von einem anderen Codierer entwickelt wurde. Diese Bibliothek kommuniziert mit dem Server über mehrere Netzwerkverbindungen, wobei mehrere Threads zusammenarbeiten. Der serverseitige Code ist ziemlich kompliziert und wir haben keinen Zugriff auf den Quellcode.

Kürzlich habe ich einen Mandelbug entdeckt , der manchmal zu einem Absturz der Anwendung führt. Ich konnte es einmal reproduzieren und bekam einen Stack-Trace, so dass ich einen Fehlerbericht öffnete. Der Fehler selbst ist einfach zu beheben (nicht erfasste Webausnahme in einem der Hintergrundthreads, die CLR veranlasst, das Programm zu beenden).

Das Problem ist, dass der Entwickler sich weigert, den Fehler zu beheben, weil er "nicht davon überzeugt ist, dass er existiert". Leider ist der Chef auf seiner Seite und meint, dass dieser Fehler nur behoben werden kann, wenn ich einen "soliden Testfall" mache, um das Vorhandensein des Fehlers zu beweisen und einen Komponententest durchzuführen, um zu überprüfen, ob er verschwunden ist. Was aufgrund der Art des Fehlers grundsätzlich unmöglich ist.

Irgendein Rat?

fithu
quelle
12
Ich würde sagen, es ist ziemlich einfach. Erstellen Sie einen Komponententest, der beweist, dass das, was Sie sagen, wahr ist.
Charles Sprayberry
1
Haben Sie den Stacktrace in irgendeiner Form gespeichert? Haben Sie beispielsweise einen Screenshot Ihrer IDE, der den Stacktrace des Absturzes zeigt?
Giorgio
7
@fithu: Du bist ein bisschen zu überzeugt, dass es unmöglich ist, solche Fehler zu reproduzieren - es mag schwierig sein, aber selten "unmöglich". Und woher wissen Sie, dass der Fehler "leicht zu beheben" ist, wenn Sie keinen Zugriff auf den Quellcode haben? Nur eine Ausnahme abzufangen, könnte das Problem nicht wirklich beheben. Oder handelt es sich um Bibliothekscode, auf den Sie Zugriff haben, und Sie haben bereits genau die Zeile bestimmt, in der der Fehler auftritt? Wenn ja, warum schlagen Sie keine Korrektur im Code vor?
Doc Brown
2
@fithu: Dein ursprünglicher Titel war eine Art Schimpfwort gegen deinen Chef. Ich habe es in der Hoffnung geändert, dass es das baldige Schließen Ihrer Frage verhindert. Es ist nicht sehr beliebt auf dieser Seite. Wenn der neue Titel Ihre Frage nicht korrekt wiedergibt, können Sie ihn weiter verbessern.
Doc Brown
4
@ Giorgio: Ein Stack-Trace ist ein Beweis dafür, dass ein Programm in einer bestimmten Zeile abstürzen kann. Es ist kein Beweis dafür, dass diese Zeile die Hauptursache des Fehlers ist. Das scheint die Tatsache zu sein, dass das OP missverstanden zu sein scheint, und die Ursache, warum ich Probleme hatte, einige Fragendetails zu verstehen.
Doc Brown

Antworten:

35

Warten Sie nach Möglichkeit einige Zeit, um zu überprüfen, ob dieser Fehler reproduziert werden kann, indem Sie Ihren Anwendungscode in den Ruhezustand versetzen oder blockieren . Aber verbringen Sie nicht zu viel Zeit. Da dieses Problem auf Multi-Theading zurückzuführen ist (und auch, wie Sie festgestellt haben), ist es selten.

Mein Rat ist, nicht zu viel darüber zu schwitzen. Setzen Sie Ihre Arbeit fort. Wenn Sie auf diesen Absturz stoßen, aktualisieren Sie Ihren Fehlerbericht mit dem Stack-Trace, der besagt, dass dies ein wiederholtes Auftreten ist , und ändern Sie den Besitzer in Bibliotheksentwickler. Lassen Sie das Management / den Lead entscheiden, ob es in Abhängigkeit von seiner Häufigkeit eine Korrektur vornimmt oder nicht.

Versuchen Sie auch, die Mentalität des Entwicklers zu verstehen. Sie sagten "Ungefangene Web-Ausnahme". Der Entwickler ist sich zu diesem Zeitpunkt möglicherweise nicht ganz sicher, wie sich dies auf andere Weise auswirkt . Daher zögert er / sie möglicherweise, den Code zu berühren.

Manoj R
quelle
10

Nach Ihren mehr oder weniger klarstellenden Kommentaren habe ich das so verstanden:

Sie sind sicher, dass nur eine einfache zusätzliche Ausnahmebehandlung fehlt, und Sie wissen bereits, welche Codezeile in der Bibliothek problematisch ist und wie die Bibliothek repariert werden könnte.

Warum fügen Sie dann nicht einfach die wenigen fehlenden Codezeilen der Bibliothek selbst hinzu und bitten das Team, die Bibliothek mit diesen Änderungen zu testen? Stellen Sie sicher, dass es sich um eine risikoarme Änderung handelt, die für den Entwickler, der für die Bibliothek verantwortlich ist, leicht verständlich ist. Das Schlimmste, was passieren kann, ist, dass jemand diese Änderung in Ihrem VCS rückgängig machen muss, wenn Ihr Fix ein neues unerwartetes Verhalten verursacht.

Die meisten Menschen sind leichter zu überzeugen, wenn die Arbeit bereits erledigt ist. Außerdem reagieren sie besser auf "Hier ist eine verbesserte Lösung", im Gegensatz zu "Dieser Code ist falsch, behebe ihn irgendwie".

BEARBEITEN: Wenn sich der Entwickler immer noch weigert, diese Änderung hinzuzufügen, versuchen Sie am besten, den problematischen Code in einem isolierten Test-Harness zum Laufen zu bringen, in dem Sie den Netzwerkfehler simulieren. Die effektive Arbeit mit altem Code beschreibt eine Reihe von Techniken, mit denen solche Probleme gelöst werden können. Beispielsweise könnten Sie eine Testversion der Bibliothek erstellen, die nur die problematischen Module und Funktionen enthält, und eine "Scheinumgebung" erstellen, in der Sie die "Netzwerkausnahme" unter kontrollierten Bedingungen simulieren können. Das mag auf den ersten Blick als zu mühsam erscheinen, aber wenn Sie eine solche Umgebung haben, können Sie ihr eine Menge zusätzlicher Tests hinzufügen (und ich denke, das wird Sinn machen, da der Autor der Bibliothek es ablehnt, fehlende hinzuzufügen Ausnahmebehandlung an einem Ort,

Doc Brown
quelle
Er weigert sich, diese Änderung zusammenzuführen, weil "es nicht notwendig ist"
bis
@fithu: siehe mein edit.
Doc Brown
4
@DocBrown +1 für Sie (Menschen) reagieren besser auf "Hier ist eine verbesserte Lösung", im Gegensatz zu "Dieser Code ist falsch, behebe ihn irgendwie".
Laika
2
@fithu: Überlegen Sie sich also einen Testfall, bei dem die nicht behandelte Ausnahme ausgelöst wird. Das heißt, Sie finden Parameter heraus, die es auslösen.
Wirrbel
2

Bei einem solchen Fehler kann ein automatischer Fuzz-Test (auch Zufallstest genannt) hilfreich sein, um ihn zu reproduzieren. Dadurch wird das Auffinden des Fehlers automatisiert, indem ein fester Satz von Parametern (oder Eingaben) in das zu testende Objekt randomisiert wird. Bei jedem Testlauf werden die Parameter in einer Protokolldatei aufgezeichnet, einschließlich Zeitstempeln usw., sodass Sie den Test bei einem Absturz (theoretisch) nur mit denselben Parametern wiedergeben können, um ihn zu reproduzieren.

Aufgrund seiner Automatisierung kann der Testprozess in kurzer Zeit viele Tests ausführen. Oft kann es über Nacht ausgeführt werden, und am Morgen können Sie eine Protokolldatei überprüfen, um festzustellen, ob der Absturz reproduziert wurde.

dodgy_coder
quelle
3
"Spielen Sie den Test einfach mit denselben Parametern ab, um ihn zu reproduzieren" - bei Threading- / Netzwerkproblemen nicht möglich. Aber ich mag die Idee.
Ab
2

Der Anwalt des Teufels schlägt einen anderen Weg vor.

Der andere Entwickler hat pauschal festgestellt, dass es dort keinen Fehler gibt.

Können Sie einen Weg finden, die Hölle aus seinem angeblich nicht existierenden Fehler herauszuheben und ihn häufiger zum Absturz zu bringen?

John R. Strohm
quelle
2

Die Stapelverfolgung ist ein klarer Beweis dafür, dass der Fehler vorhanden ist oder zumindest in einem bestimmten Build vorhanden war. Was Sie nicht haben, ist der Beweis, dass der Fehler behoben wurde. Sie sind dumm, es zu ignorieren. Ich hatte "unmöglich zu reproduzierende" Fehler nach hunderttausenden automatisierten Versuchen auf mehreren Systemen, die jedes Mal auf dem System eines Kunden ausgelöst wurden .

Ich bekomme so ein paar Bugs pro Jahr, die meisten sogar ohne Stack-Trace. In fast allen Fällen konnte ich, obwohl ich es vorher nicht reproduzieren konnte, ziemlich einfach einen automatisierten Test dafür durchführen, sobald es repariert war.

Zum Beispiel habe ich vor ein paar Monaten einen Fehler behoben, der nur auftrat, wenn der Benutzer schneller als 96 Wörter pro Minute tippte. Bevor ich es reparierte, wusste ich nur, dass der Fehler "manchmal" passierte. Es würde mir nie einfallen, einen Unit-Test für schnelles Tippen zu schreiben. Nachdem ich die Grundursache gekannt hatte, war es jedoch trivial, einen Test dafür zu machen.

Selbst in den seltenen Fällen, in denen ein Fehler nicht reproduziert werden kann, nachdem er behoben wurde, können Sie ihn durch Codeüberprüfung schließen.

Karl Bielefeldt
quelle
Wie macht man einen automatisierten Test für solche Sachen? (Um Missverständnisse zu vermeiden, stimmt alles, was Sie geschrieben haben, mit meinen eigenen Erfahrungen und Überzeugungen überein.) Mein letzter Fehler, wie dieser, war ein Datenwettlauf um nicht synchronisierten gleichzeitigen Zugriff. Sowohl der Fehler als auch die Fehlerbehebung waren durch Codeprüfung sehr einfach zu beweisen, aber ich kann nicht Stellen Sie sich vor, wie Sie das zuverlässig automatisch testen können. (Ich habe meistens kleine Probleme beim Entwerfen von Tests für gleichzeitige Inhalte, kann aber keinen Testcode ermitteln, um das Fehlen eines
Datenrennens
1
Das könnte in meine Code-Inspektions-Ausnahme fallen, aber Sie können auch Race-Bedingungen auslösen, indem Sie eine Verzögerung in einem der Threads einfügen. Oft können Sie dies erreichen, indem Sie einen externen Stimulus verzögern, oder weniger idealerweise können Sie die Verzögerung während des Tests direkt in den Code einfügen.
Karl Bielefeldt
Ich verstehe, danke. Klingt interessant, ich brauche es einige Gedanken geben ...
gnat