Sie haben versendet, Sie erhalten einen seltenen Seg-Fehler. Zeiger überprüfen oder loslassen?

9

Sie haben versendet, Asserts sind deaktiviert, Sie erhalten einen seltenen Absturzbericht, der angibt, dass in Ihrem Code eine Nullzeigerverletzung aufgetreten ist. In einer Entwicklungsumgebung wäre das Problem von einer Behauptung erfasst worden.

Sie haben lediglich einen Absturzbericht, sodass eine Reproduktion des Problems nahezu unmöglich ist. Das Folgen der Rückverfolgung gibt keine Hinweise darauf, warum der Absturz überhaupt passiert ist.

Optionen: - Zeigerprüfung hinzufügen, um den Absturz zu verhindern. Dies wird den Absturz verhindern, aber Sie werden wahrscheinlich nicht einmal herausfinden, warum es überhaupt passiert ist. - lass es fliegen, hoffe es passiert wieder mit einem Repro-Szenario

Angenommen, die Anwendung ist nicht für eine Lenkwaffe oder ein automatisches Bremssystem vorgesehen ...

Welches würdest du nehmen?

MM01
quelle
Sofern dies nicht rethorisch ist, kann es nützlich sein, den Absturzbericht zusammen mit den entsprechenden Codedateien (möglicherweise auf Pastebin.com) auf der Stack Overflow-Site zu veröffentlichen, wenn dies behoben werden soll ...
Tamara Wijsman
2
@ TomWij: Glaube nicht ... es wird höchstwahrscheinlich als "zu lokalisiert" geschlossen
Naveen
@Naveen: Vielleicht ... Ich bin kein regelmäßiger SO-Besucher, also war dies ein SU-Mind-Kommentar.
Tamara Wijsman
1
@Naveen: Zu lokalisiert bedeutet zu regional, es geht um Geografie und nicht um Spezialisierung der Themen. Aber diese Frage würde SO wahrscheinlich durch Subjektivität geschlossen.
Maniero

Antworten:

7

Ich habe den zweiten Ansatz gewählt. Es macht keinen Sinn, den Absturz auszublenden, wenn der NULL-Zeiger an dem Punkt, an dem der Absturz aufgetreten ist, unerwartet war. Dieser NULL-Zeiger ist in den meisten Fällen nur eines der Symptome dafür, dass etwas anderes nicht stimmt. Wenn wir es mit einem NULL-Zeiger ausblenden, ist es fast sicher, dass etwas anderes kaputt geht. Ich denke, Sie haben eine bessere Chance, das Szenario zu erfassen, wenn Sie den Punkt kennen, an dem es jedes Mal stattdessen an einem zufälligen Ort abstürzt.

Naveen
quelle
1
Ich neige selbst zu dieser Meinung. Die Benutzerwahrnehmung macht mir Sorgen. Ein Absturz sieht eindeutig so aus, als ob etwas schief gelaufen ist. Wenn eine Funktion jedoch völlig falsch berechnet wird, wird dies ebenfalls bemerkt.
MM01
2
Obwohl der Benutzer durch den gelegentlichen Absturz irritiert wird, wird er meiner Meinung nach sehr verärgert sein, wenn er ein falsches Ergebnis liefert, da er möglicherweise unbemerkt bleibt.
Naveen
Absturz so früh wie möglich, es hilft Ihnen, das Problem zu finden, und es hilft dem Benutzer, weniger Daten zu
verlieren
Außerdem würde ich valgrind verwenden, um herauszufinden, was ich falsch mache (oder zumindest versuchen, auf jeden Fall einige Probleme zu finden, die Sie beheben sollten). Ich würde zusätzliche Asserts hinzufügen, um zu versuchen, den NULL-Zeiger früher zu fangen und Bitten Sie den Benutzer, einen Build
auszuführen,
3
  1. Wie oft tritt der Absturz auf? Es passiert nur für einen von vielen Kunden in einem obskuren Fall? Was sind die Folgen (Datenverlust, Systemabsturz)? Wenn es in einer Million Fällen alle 1 passiert und die Anwendung nur neu gestartet werden muss und keine Daten verloren gehen, müssen Sie sie wahrscheinlich nicht reparieren - lassen Sie es so.

  2. Wie teuer (Geld und Zeit) ist es, die Asserts hinzuzufügen und an alle Kunden zu versenden (wenn nur ein Teil der Kunden die neue Version erhält, kann der Rest in das nicht überprüfte Nullproblem geraten)? Wie hoch sind die Chancen, das Problem zu finden? Wenn Sie den Code nur nach dem Zufallsprinzip überprüfen, um den Fehler zu erkennen, ist dies eine schlechte Vorgehensweise ...

  3. Kann das Problem auf dem Computer des Kunden reproduziert werden? Können Sie auf diese Maschine zugreifen? Das könnte wirklich wertvoll sein

  4. Überprüfen Sie Ihre Absturzberichte und stellen Sie sicher, dass die bereitgestellten Informationen nützlich sind und Ihnen bei der Diagnose des Problems helfen können

Victor Hurdugaci
quelle
2

In einer Entwicklungsumgebung wäre das Problem von einer Behauptung erfasst worden.

In einer bestimmten Reihenfolge wäre es abgefangen und behoben worden, aber die aktuelle Rückverfolgung wurde nie abgefangen.
Sie sollten in der Lage sein zu sehen, was mit dem Absturzspeicherauszug schief gelaufen ist, haben Sie Parameter überprüft usw.?

Die Extras, die basierend auf der Zeit ausgeführt werden können, die Sie dafür verwenden möchten:

  • Archivieren Sie den Absturzspeicherauszug und verweisen Sie im Code mit einem Kommentar auf die Zeile, in der er abgestürzt ist.
    Dadurch kann einer, der einen sehr ähnlichen Speicherauszug untersucht, feststellen, dass er bereits vor ...
    [Zeitaufwand: kurz]

  • Zusätzliche Überprüfungen, Protokollierung, ... Sie möchten dies verhindern und beim nächsten Mal weitere Informationen erhalten.
    [Zeitaufwand: mittel]

    In Ihrem Code ist eine Verletzung des Nullzeigers aufgetreten.

  • Stellen Sie sicher, dass die Anwendung nicht auf diese Weise aufgerufen werden kann, damit dieser Verstoß auftritt.
    [Zeitaufwand: lang]

Tamara Wijsman
quelle
1
In diesem Beitrag geht es nicht so sehr um den Ansatz zur Lösung des Problems, sondern vielmehr um die Vorgehensweise in einer hypothetischen Situation (dh in dem zugewiesenen Zeitrahmen konnte die Ursache des Problems nicht abgeleitet werden).
MM01
2

In diesen Tagen versende ich mit aktiviertem assert (). Es kostet nicht viel und kann das Leben in feindlichen Situationen viel einfacher machen (dh die Umgebungen Ihrer Kunden sind oft feindlicher als Ihre Entwicklungs- oder QS-Umgebungen).

Mitch Haile
quelle