Frage

Ich schreibe eine C-Anwendung, die über einen Computer-Cluster ausgeführt wird (Kondor verwenden). Ich habe viele Methoden versucht, den fehlerhaften Code zu offenbaren, aber ohne Erfolg.

Clues:

  • Auf Durchschnitt, wenn ich den Code auf 15 Maschinen für 2 Tage laufen, bekommt ich zwei oder drei segfaults (Signal 11).
  • Wenn ich den Code lokal ausgeführt Ich habe nicht eine segfault. Ich lief es für fast 3 Wochen auf meinem Rechner zu Hause.

Versuche:

  • lief ich den Code in valgrind für vier Tage vor Ort ohne Speicherfehler.
  • I erfasst das segfault Signal von meinen eigenen Signal-Handler definiert, so dass ich ausgeben kann einen Teil des Programmzustandes.
  • Wenn nun ein segfault passiert kann ich den aktuellen Stack auszudrucken Backtrace verwenden.
  • Ich kann Variablenwerte ausdrucken.
  • Ich habe eine Variable, die auf die aktuelle Zeilennummer eingestellt ist.
  • Haben Sie versucht auch Stücke des Codes aus zu kommentieren, dass der Hoffnung, wenn das Problem verschwindet Ich werde die segfault entdecken.

Leider ist die Zeilennummer ausgegeben wird, ziemlich zufällig. Ich bin nicht ganz sicher, was ich mit dem Stacktrace zu tun. Bin ich in der Annahme richtig, dass es nur die Adresse der Funktion, in den Aufzeichnungen die segfault auftritt?

Der Verdacht:

  • Ich vermute, dass das Kontrollsystem, das Zeigte condor Anwendungen Arbeitsplätze in Maschinen zu bewegen, um Speicherfehler empfindlicher ist, und das ist, warum ich es nicht vor Ort sehen.
  • , die Indizes werden von der Bug beschädigt, und dass diese Indizes verursachen die segfault. Dies würde die Tatsache erklärt, dass die segfaults auf ziemlich zufällig Zeilennummern auftreten.

UPDATE

sucht dieses einige mehr habe ich die folgenden Links:

UPDATE 2

Greg schlug am condor log suchen und zu ‚korrelieren die segfaults, wenn condor startet die ausführbare Datei von einem Checkpoint‘. bei der der Suche protokolliert die segfaults alle unmittelbar nach einem Neustart auftreten. erscheinen alle Ausfälle auftreten, wenn ein Auftrag von einem Typ von Maschine schaltet auf einen anderen Typ.

UPDATE 3

Die segfault durch Unterschiede zwischen den Hosts verursacht wurde, durch Setzen des ‚requiremets‘ Feld der Kondor-Datei Problem einreichen vollständig verschwunden.

Man kann einzelne Maschinen gesetzt:

requirements = machine == "hostname1" || machine == "hostname2"

oder eine ganze Klasse von Maschinen:

requirements = classOfMachinesName

Siehe Anforderungen Beispiel hier

War es hilfreich?

Lösung

, wenn Sie können, kompilieren mit dem Debuggen und unter gdb laufen. alternativ erhalten core dumped und Last, die in Debugger.

mpich hat eingebaute Debugger, oder Sie können kommerzielle parallel Debugger kaufen.

Dann können Sie Schritt durch den Code zu sehen, was in Debugger geschieht

http://nmi.cs.wisc.edu/node/1610

http://nmi.cs.wisc.edu/node/1611

Andere Tipps

Können Sie einen Core Dump erstellen, wenn Ihr segfault passiert? Anschließend können Sie diese Dump debuggen, um herauszufinden, den Zustand des Codes, um zu versuchen, wenn es abgestürzt ist.

Betrachten Sie, was Anweisung verursacht den Fehler. War es auch ein gültiger Befehl oder versuchen Sie Daten auszuführen? Wenn gültig, was Speicher ist es, den Zugang versuchen? Wo hat dieser Zeiger kommen. Sie müssen sich für die Position der Störung verengen (Stack Korruption, Heapbeschädigung, nicht initialisierten Zeiger, ungültigen Speicherzugriff). Wenn es sich um eine Korruption ist, ob, wenn es keine verräterischen Daten in dem beschädigten Bereich (Zeiger auf Symbole, Daten, dass sieht aus wie etwas in Ihren Strukturen, ...). Ihr Speicherzuordner bereits eingebaute Funktionen haben kann einige Korruption zu debuggen (siehe MALLOC_CHECK_ unter Linux oder MallocGuardEdges auf Mac OS). Ein häufiger Fall für diese ist Speicher verwenden, die frei war () 'd, so dass Ihre malloc Anmeldung () / free () Paare helfen können.

Wenn Sie das condor_compile Werkzeug verwendet haben, Ihren Code mit dem Kondor Prüfpunktverfahrens Code erneut zu verknüpfen, hat es ein paar Dinge anders als eine normale Verbindung. Am wichtigsten ist, es verbindet statisch Code und verwendet seine eigene malloc. Ein weiterer großer Unterschied ist, dass Kondor wird es dann auf einem fremden Rechner laufen, wo die Umwelt unterschiedlich genug sein kann, von dem, was Sie zu verursachen Probleme erwarten.

Die ausführbare Datei von condor_compile erzeugt wird als eigenständiges binären außerhalb des Kondors Systems runnable. Wenn Sie die binäre emittiert von condor_compile lokal ausgeführt, außerhalb von Kondor, tun Sie noch die segfaults sehen?

Wenn es nicht der Fall ist, können Sie die segfaults korrelieren, wenn condor startet die ausführbare Datei von einem Kontrollpunkt (der Benutzeranmeldung wird Ihnen sagen, wann dies geschieht).

Sie haben versucht, das meiste, was ich denken würde. Die einzige andere Sache, die ich würde vorschlagen, wird beginnen viele Logging-Code hinzufügen und hoffen, dass Sie verengen, wo der Fehler passiert ist.

Das einzige, was Sie nicht sagen, ist, wie viel Flexibilität, die Sie das Problem zu lösen haben. Können Sie zum Beispiel haben das System zum Stillstand kommen und einfach Ihre Anwendung ausführen? Auch, wie wichtig sind diese Abstürze zu lösen?

Ich gehe davon aus, dass in den meisten Fällen Sie tun. Dies kann eine Menge von Ressourcen erfordern.

Der kurzfristige Schritt Tonnen setzt von „behauptet“ (halb handgeschriebenen) jeden Variablen um sicherzustellen, hat es sich nicht geändert, wenn Sie nicht wollen, dass es zu. Dies kann g WWeiter zu arbeiten, wie Sie langfristig Prozess durchlaufen.

Lange term-- versuchen, es auf einem Cluster von zwei Laufe (vielleicht Ihr Computer zu Hause und eine VM). Sehen Sie noch die segfaults. Wenn nicht die Clustergröße erhöhen, bis Sie beginnen segfaults sehen.

Ausführen es auf einer Minimalkonfiguration (um segfaults) und alle Ihre Eingaben bis zu einem Absturz aufzeichnen. Automatisieren Sie das System mit den Eingängen ausgeführt wird, dass Sie aufgezeichnet, zwicken sie, bis Sie konsequent einen Absturz mit minimalem Aufwand erhalten.

An diesem Punkt schauen Sie sich um. Wenn Sie noch nicht den Fehler nicht finden, dann werden Sie wieder fragen müssen, mit einigen zusätzlichen Daten, die Sie mit diesen Läufen gesammelt.

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