皆さん、c ++で構築され、Linux x86_64で動作する本番マルチスレッドサーバーでメモリの破損を検出するためのツールをお勧めしますか?現在、次の問題に直面しています。数時間ごとにサーバーがセグメンテーション違反でクラッシュし、コアダンプは、malloc / callocでエラーが発生したことを示しています。これは、メモリがどこかで破損していることを示しています。
実際、私はすでにいくつかのツールを試してみましたが、運が悪かったです。これまでの私の経験は次のとおりです。
Valgrindは優れた(私も最高だと思いますが)ツールですが、サーバーの速度が大幅に低下し、本番環境で使用できなくなります。ステージサーバーで試してみたところ、メモリ関連の問題を見つけるのに本当に役立ちましたが、それらを修正した後でも、運用サーバーでクラッシュが発生します。ステージサーバーをValgrindで数時間実行しましたが、それでも重大なエラーを見つけることができませんでした。
ElectricFenceは本当の記憶を奪うと言われていますが、私はそれを正しく動作させることさえできませんでした。Valgrindがまったく問題を示さなかったランダムな奇妙な場所で、ステージサーバー上でほぼ即座にセグフォールトします。たぶんElectricFenceはスレッド化をうまくサポートしていませんか?..私にはわかりません。
DUMA-ElectricFenceと同じ話ですが、さらに悪いです。EFが読み取り可能なバックトレースを使用してコアダンプを生成している間、DUMAは「?????」のみを表示します(そして、はい、サーバーは確かに-gフラグで構築されています)
dmalloc-標準のmallocルーチンの代わりにそれを使用するようにサーバーを構成しましたが、数分後にハングします。プロセスにgdbをアタッチすると、dmallocのどこかにハングしていることがわかります:(
私は徐々に夢中になり、次に何をすべきかわからなくなっています。私は次のツールを試す必要があります:mtrace、mpatrolですが、誰かがもっと良いアイデアを持っているかもしれませんか?
この問題についての助けをいただければ幸いです。
更新:バグの原因を見つけることができました。ただし、helgrind / DRD / tsanを使用する本番サーバーではなく、ステージサーバーで検出しました。複数のスレッド間にデータレースがあり、メモリが破損していました。これらのツールは誤検知が多すぎるため、適切なvalgrind抑制を使用することが重要でした。それでも、大幅な速度低下なしに本番サーバーでこれを検出する方法はわかりません...