Frage

Ich habe ein Multi-Thread-C-Programm, das konsequent einen Segmentierungsfehler an einem bestimmten Punkt im Programm erzeugt. Wenn ich es mit gdb ausführen, wird kein Fehler angezeigt. Können Sie aus irgendeinem Grund denken, warum der Fehler nur auftreten, wenn sie nicht den Debugger verwenden? Es ist ziemlich ärgerlich, nicht in der Lage, das Problem zu finden!

War es hilfreich?

Lösung

Classic Heisenbug . Aus Wikipedia:

Die Zeit kann auch ein Faktor in heisenbugs sein. ein Programm unter der Steuerung eines Debuggers ausführt kann die Ausführungszeit des Programms ändern, wie in der Normalausführung verglichen. Zeitkritische Fehler wie Race Conditions reproduzieren kann nicht, wenn das Programm durch Einzelschritt Source-Leitungen im Debugger verlangsamt. Dies gilt insbesondere dann, wenn das Verhalten Interaktion mit einer Einheit beinhaltet nicht unter der Kontrolle eines Debuggers, wenn beispielsweise Netzwerkpaketverarbeitung zwischen zwei Maschinen Debuggen und nur eine ist unter Debuggersteuerung.

Der Debugger Timing sich ändern kann, und eine Race-Bedingung versteckt.

Unter Linux GDB deaktiviert auch Adressraum Randomisierung und der Absturz kann spezifisch für Adressraum Layout sein. Versuchen Sie (gdb) set disable-randomization off.

Schließlich ulimit -c unlimited und Post-Mortem-Debugging (bereits von Robie vorgeschlagen) arbeiten können.

Andere Tipps

Vielleicht bei der Verwendung von gdb Speicher an einem Ort zugeordnet ist, die Sie über / unter Strömung nicht trampelte auf Speicher, der einen Absturz verursacht. Oder es könnte eine Race-Bedingung sein, die nicht mehr ausgelöst bekommen werden. Obwohl es nicht intuitiv klingt, sollten Sie sein happy Ihr Programm war schön genug, um auf Sie zum Absturz bringen.

Einige Vorschläge

  1. einen statischen Code-Analyse Versuchen wie dem freien cppcheck
  2. Versuchen Sie, eine malloc () Debugger wie libefence
  3. Versuchen Sie es durch valgrind
  4. Laufen

Mit dem es Debuggen Sie die Umgebung ändern, dass es aktiv ist. Es klingt wie Sie mit irgendeiner Art von Race-Bedingung zu tun haben, und durch sie Dinge debuggen etwas anders geplant werden, so haben Sie begegnen nicht das Problem. Das, oder Dinge werden in einer etwas anderen Weise gespeichert, damit es nicht auftreten. Sind Sie in der Lage einige Debug-Ausgaben in den Code zu setzen, herauszufinden, um das Problem zu helfen? Das mag weniger Auswirkungen haben und können Sie Ihr Problem finden.

Ich habe total dieses Problem vor hatte! Es war eine Race-Bedingung, und wenn ich mit einem Debugger den Faden obwohl der Code schrittweise in i war, langsam genug, um das Rennen nicht Zustand auslösen. Ziemlich furchtbar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top