Ragazzi, si può raccomandare uno strumento per individuare un danneggiamento della memoria su un server multithreaded di produzione creato con C++ e funzionante con linux x86_64? Attualmente sto affrontando il seguente problema: ogni ora il mio server si blocca con un segfault e il core dump mostra che l'errore si verifica in malloc/calloc che è sicuramente un segno di memoria corrotta da qualche parte.Tracciamento della memoria danneggiata su un server Linux di produzione
In realtà ho già provato alcuni strumenti senza molta fortuna. Ecco la mia esperienza finora:
Valgrind è un grande (mi piacerebbe anche dire migliore) strumento, ma rallenta il server di troppo che lo rende inutilizzabile in produzione. L'ho provato su un server stage e mi ha davvero aiutato a trovare alcuni problemi relativi alla memoria, ma anche dopo averli risolti ho ancora degli arresti anomali sul server di produzione. Ho eseguito il mio stage server sotto Valgrind per diverse ore ma non sono riuscito a individuare errori gravi.
Si dice che ElectricFence sia un vero e proprio mago della memoria, ma non riuscivo nemmeno a farlo funzionare correttamente. Segfaults quasi immediatamente sul server del palcoscenico in luoghi strani e casuali in cui Valgrind non mostrava alcun problema. Forse ElectricFence non supporta il threading bene? .. Non ne ho idea.
DUMA - stessa storia di ElectricFence ma anche peggio. Mentre EF produceva core dump con backtrace leggibili DUMA mi mostra solo "?????" (e sì server è costruito con -g flag di sicuro)
dmalloc - Ho configurato il server per usarlo al posto di malloc standard routine tuttavia si blocca dopo diversi minuti. . Collegamento di un gdb al processo rivela che è appeso da qualche parte nel dmalloc :(
sto gradualmente ricevendo pazzo e semplicemente non so che cosa fare dopo che ho i seguenti strumenti per essere processato: mtrace, mpatrol ma forse qualcuno ha un'idea migliore
apprezzerei molto di aiuto su questa edizione
Update:?.. sono riuscito a trovare la fonte del bug Tuttavia ho trovato sul server palco non uno di produzione usando helgrind/DRD/tsan - c'era un datarace tra diversi thread che portava alla memoria corrotta ionico. La chiave era usare le appropriate soppressioni valgrind poiché questi strumenti mostravano troppi falsi positivi. Ancora non so davvero come questo può essere scoperto sul server di produzione senza rallentamenti significativi ...
Hai compilato libefence in o usa la variabile env LD_PRELOAD? electricfence è thread safe presumibilmente se è compilato con -DUSE_SEMAPHORE –
Sto usando libefense.a not .so. E non l'ho compilato da solo, l'ho installato usando emerge su Gentoo. Consiglieresti di installarlo manualmente invece con questo flag? – pachanga
Una cosa che potrebbe aiutare è guardare +/- 200 byte di dove l'errore seg ha detto che i dati sono corrotti. Osservando i dati potresti essere in grado di avere un'idea di cosa sta causando il danneggiamento della memoria. – steve