Erfahrung mit Threading/Speicher, Problem Findung/Stresstests
-
Ich hatte vor ein paar Tagen schon mal einen ähnlichen Post erstellt, der war aber nicht ganz konform zu den Forums-Regeln also habe ich den Post nochmal neu formuliert und hoffe bei diesem hier auf interessantens Feedback
Es geht mir primär um C/C++ Software (wobei ich auch schon in Delphi oder Java, C# Schnittstellen hin zu C Fehler dieser Art finden musste)
-die ein bisschen oder viel asynchrone Berechnungen oder IO-Behandlungen enthält (z.B. Kommunikation zu Maschinen/Servern usw.)
-meist als Daemon oder Service/Process ohne GUIs
-kleine Libs mit schöner API oder komplette Programme mit allem im Bauch ohne starke modulare Trennung
-die schon älter, fertig oder am Ende ihrer Entwicklung steht - (meist >500-800kLOC) = ich kann da auch nicht leichtens was Umbauen oder mal schnell Tests extrahieren
-die teilweise nicht unter Linux/GCC läuft/kompiliert also nicht mit den Sanitizern oder Valgrind getestet werden können
-zu groß oder schwer zerlegbar sind um so einfach durch den Intel Inspector und Konsorten gejagt zu werden (Testlauf wird viel zu lang oder verlangsamt zu sehr)
-meistens nicht von mir entwickelt wurdenWorum es mir geht:
-ich will weitere Hilfsmitteln/Strategien kennen lernen um Fehler zu entdecken
-Szenario-Findung für schwer reproduzierbare - also eher stochern im trüben Wasser, pseudo hardeningWorum es mir absolut nicht geht:
-Effektivere Ausnutzung von Parallelisierung oder bessere Skalierung über mehr CPUs/Kerne/Threads oder Prozesse oder die leichtere Programmierung davon
-Ich habe kein akutes Problem das ich zu lösen versuche - finden und lösen kann ich, aber geht es noch besser/schneller?Hilfsmittel/Strategien die ich schon nutze:
-statischen Analyse-Tools with cppcheck, PVS-Studio, VS-Analyzer, Warning-Level, clang-tidy, Coverity, CodeSonar... - die freien immer, die kommerziellen soweit beim Kunden verfügbar
-dynamische Analyse-Tools: Sanitizer, Valgrind, Kompiler-Features
-unterschiedliche Kompiler, Platformen, Betriebssysteme und Standardlibs sind auch sehr schön um Fehler zu finden
-bei 32Bit auf 64Bit portierung die Applikation zwangsweise über der 4GB-Grenze in den Speicher zu laden - um schneller fiese Pointer-Cast Fehler zu findenPraxiserfahrungen:
wenn ich Software die primär unter 32Bit getestet wird unter 64Bit laufen lasse finde ich mehr latente Speicher/Threading Fehler (auf gleicher Hardware, gleiche Testszenarien)
mir ist noch unklar ob das primär durch die andere Codegenerierung, mehr Speicherbewegung durch fettere Pointer, langsamere/schnellere Codeausführung usw. verursacht wird - wahrscheinlich
von allem ein bisschenbei Threading habe ich z.B. die Erfahrung gemacht das ich mehr Fehler finde wenn man die Software auf langsamen/schnellen, wenig/viele Kernen Systemen mit den Testszenarien stresst
Ich hatte mal eine Software die nur auf einem alten SingleCore-System in kurzen Abständen Deadlocks hatte, auf keinem Multi-Core System ist in Stresstests (die über Tage gelaufen sind)
dieser Fehler aufgetretenhat von euch jemand auch solche Erfahrungen oder kann Tips geben: Ein Tip war schon mal das man bei MultiCore-Systemen
Kerne auch gezielt abschalten kann, z.B. im BIOS um ein SingleCore System zu erhaltenvielleicht gibt es ja ein paar Leute die ein bisschen aus dem Nähkästchen plaudern wollen