Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Hallöchen allerseits,
jeden läuft ja früher oder später mal in ein sog. Heisenbug über den Weg. Also einen Bug der nur Auftritt wenn kein Debugger angeschlossen ist. Da ich eben gerade eine halbe Stunde gebraucht habe um meinen letzten zu finden, würde mich gerne mal interessieren wie ihr mit so etwas umgeht.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Die meisten Heisenbugs konnte ich mit Valgrind bzw. Memcheck besiegen, einfach, weil es meist Memory Corruption ist, wenn sowas passiert. Übel ists natürlich, wenn das auf dem Stack passiert. Dann würde ich heutzutage versuchen, mit clang -fsanitize=address ranzugehen, das soll wohl auch Overruns aufm Stack abfangen.
Wenn der Bug auf Threading zurückzuführen ist, mache ich das gleiche mit Helgrind (ein Valgrind-Tool um Threads zu debuggen), welches einem ja netterweise alle möglichen Data Races mit nem haufen Informationen rausspillt, bzw irgendwann muss ich dann auch mal das analoge clang-Feature -fsanitize=thread ausprobieren.
viele grüße, Horazont
p.s.: Den bisher größten Heisenbug werde ich natürlich im Mai mit fedup los.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2622 Wohnort: Berlin
Programmiersprache: Go, C/C++
Die schlimmsten Bugs dieser Art finde ich sind Synchronisierung Probleme. Debugger, Memcheck, valgrind und ähnliche tools spielen meistens solchen Bugs in die Hand, weil diese z.B. das ablaufverhalten verändern, wo vorher nur 1 oder 2 Ausstiegspunkte für den Prozess Sheduler waren, gibt es nun viel mehr, weil man extra Code ersetzt, der in der Regel auf Systemfunktionen zugreift und diese auch Ausstiegspunkt für den Prozesswechsel im Sheduler mit sich bringen. Wo also vorher der Code so schnell durchlaufen wurde, dass die Resourcen durch nicht korrektes Synchronisieren ein Fehler verursacht hat, ist der Code nun so langsam, dass die sich einfach garnicht mehr beißen. Sowas hat mich mal einige Tage auf ein Produktivserver gekostet, weil der Bug leider auch nur nach einigen Stunden Laufzeit auftrat.
Um solchen Problemen sehr schnell auf die Spur zu kommen helfen Sleep Funktionen mit random größen nacheinander in einen Thread zu platzieren. Das sorgt dafür, dass der Programmfluss nicht mehr gleich bleibt und der Fehler sehr viel schneller auftreten wird, weil immer nur ein Thread langsamer wird.
Es gibt sehr selten auch den Fall, dass man mit dem Debugger dann doch noch den Bug finden kann, wenn man z.B. jeden Schreibzugriff auf die Resource überwacht. Das Funktioniert leider nur Sinnvoll, wenn man nicht gerade oft auf die Resource zugreift.
Zum Glück bin ich solchen Bugs nur extrem selten begegnet.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Ja vom Asynchronen Zeugs kann ich dir ein Lied singen. Ich hatte vor 2-3 Jahren da mal ein richtigen Alptraum von Server bei uns in der Wartung. Das Teil hatte ausfuehrbaren Code auf unterschiedliche Arten von Client-Software verteilt. Da hat es dann mal eben 1-2 Tage gedauert bis man wusste woher nun der Wert XY eigentlich mal her kam.
Dort half dann nur noch brutal alles ueber die Konsole auszugeben.
ich hatte vor 2 Monaten einen heftigen Bug in unserem Applikationsserver, der nur aufgetreten ist, wenn man mit 50 bis 100 Clients über mehrere Stunden auf den Server "draufgehauen" hat. Die Logfiles waren total unbrauchbar, weil da alleine in ner Minute über 100mb an Logs rausgekommen sind. Hatte dann allein schon zwei Tage gedauert, bis ich gemerkt hab, das der Bug nur in einem Release Build und auch nur ohne Debugger auftritt.
Am Ende hab ich den Code durchgekuckt, in dem ich den Fehler vermutet hatte und dann alles, was auch nur in fernster Weise mit einem Synchronisierungsproblem zu hatte haben können, synchronisiert, solange, bis es nicht mehr aufgetreten ist und da danach schrittweise die Synchronisierung wieder herausgekommen.
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.