Frage

Jungs, könnten Sie bitte ein Werkzeug für das Auffinden einer Speicherbeschädigung auf einem Produktions multithreaded Server gebaut mit c ++ und Arbeiten unter Linux x86_64 empfehlen? Ich bin zur Zeit folgendes Problem:. Alle paar Stunden mein Server mit einem segfault stürzt und den Core-Dump zeigt, dass Fehler in malloc geschieht / calloc, die sein beschädigtes irgendwo auf jeden Fall ein Zeichen der Erinnerung

Eigentlich haben versucht, habe ich schon einige Werkzeuge ohne viel Glück. Hier ist meine Erfahrung so weit:

  • Valgrind ist ein großes (ich würde sogar sagen, am besten) Werkzeug, aber es verlangsamt den Server zu viel nach unten so dass es in der Produktion unbrauchbar. Ich versuchte es auf einer Bühne Server, und es hat mir wirklich geholfen, einige Speicher Fragen zu finden, aber auch nach ihnen Festsetzung ich immer noch Abstürze auf dem Produktionsserver bekommen. Ich ließ meine Bühne Server unter Valgrind für mehrere Stunden, aber immer noch keine schwerwiegenden Fehler erkennen kann.

  • ElectricFence sagte ein Realspeicher Schwein sein, aber ich konnte nicht einmal bekommen es richtig funktioniert. Es Segfaults fast sofort auf der Bühne Server in zufälligen seltsamen Orten, an denen Valgrind keine Probleme auf alle zeigten. Vielleicht ist ElectricFence nicht gut unterstützen Threading? .. Ich habe keine Ahnung.

  • DUMA - gleiche Geschichte wie ElectricFence aber noch schlimmer. Während EF Core-Dumps mit lesbarer Backtraces DUMA zeigt produzierte ich nur "?????" (und ja Server mit Option -g sicher gebaut wird)

  • dmalloc - ich den Server konfiguriert, es zu benutzen, anstatt Standard malloc Routinen aber es nach einigen Minuten hängt. GDB dem Prozess seinen hing irgendwo in dmalloc Anbringen offenbart: (

Ich bekomme allmählich verrückt und einfach nicht wissen, was als nächstes zu tun. Ich habe folgende Werkzeuge ausprobiert werden:? Mtrace, mpatrol aber vielleicht hat jemand eine bessere Idee

ich sehr jede mögliche Hilfe zu diesem Thema schätzen würde.

Update: Ich schaffte es, die Quelle des Fehlers zu finden. Allerdings fand ich es auf der Bühne Server nicht die Produktion eines mit Helgrind / DRD / tsan - es gab eine datarace zwischen mehreren Fäden, die in einer Speicherbeschädigung geführt. Der Schlüssel war die richtige valgrind Unterdrückungen zu verwenden, da diese Werkzeuge zu viele Fehlalarme zeigte. Noch weiß ich nicht wirklich, wie kann dies ohne wesentliche Verlangsamungen auf dem Produktionsserver entdeckt werden ...

War es hilfreich?

Lösung 3

Folks, gelang es mir, die Quelle des Fehlers zu finden. Allerdings fand ich es auf der Bühne Server mit Helgrind / DRD / tsan - es gab eine datarace zwischen mehreren Fäden, die in einer Speicherbeschädigung geführt. Der Schlüssel zur Verwendung war richtige valgrind Unterdrückungen, da diese Werkzeuge zeigte zu viele Fehlalarme. Noch weiß ich nicht wirklich, wie kann dies ohne wesentliche Verlangsamungen auf dem Produktionsserver entdeckt werden ...

Andere Tipps

Ja, C / C ++ Speicherbeschädigung Probleme sind zäh. Früher habe ich auch mehrmals valgrind, manchmal ist es das Problem ergeben, und manchmal nicht.

Während valgrind Ausgang der Prüfung nicht dazu neigen, ihr Ergebnis zu ignorieren zu schnell. Manchmal nach eine beträchtliche Zeit damit verbracht, Sie werden sehen, dass valgrind gab dir den Schlüssel auf dem ersten Platz, aber Sie ignoriert es.

Ein weiterer Rat ist die Code-Änderungen von den bisher bekannten stabilen Version zu vergleichen. Es ist kein Problem, wenn Sie irgendeine Art von Quelle Versionierungssystem verwenden (z SVN). Untersuchen Sie alle speicherbezogenen Funktionen (z Memcpy, memset, sprintf, neu, löschen / delete []).

Kompilieren Sie Ihr Programm mit gcc 4.1 und den -fstack Schutz-Schaltersystemen. Wenn die Speicherbeschädigung durch Stapel verursacht wird zerschlagen sollte es erkennen kann. Sie müssen möglicherweise mit einigen der zusätzlichen Parameter von SSP spielen.

Versuchen Sie dieses: http://www.hexco.de/rmdebug/ Ich habe es ausgiebig, seine geringe Auswirkungen auf die Leistung hat (es meist Auswirkungen Menge RAM), aber der Zuordnungsalgorithmus ist die gleiche. Es ist immer genug erwiesen keine Zuordnung Fehler zu finden. Ihr Programm wird so schnell zum Absturz bringen, wie der Fehler auftritt, und es wird ein detailliertes Logbuch hat.

Ich bin sicher nicht, wenn es Ihre spezielle Bug gefangen haben würde, aber die MALLOC_CHECK_ Umgebungsvariable ( malloc Mann ) schaltet eine zusätzliche Prüfung in der malloc Implementierung Linux Standard, und in der Regel keine signifikant Laufzeitkosten hat.

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