15

皆さん、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抑制を使用することが重要でした。それでも、大幅な速度低下なしに本番サーバーでこれを検出する方法はわかりません...

4

8 に答える 8

7

はい、C /C++のメモリ破損の問題は困難です。また、valgrindを数回使用しましたが、問題が明らかになることもあれば、そうでないこともありました。

valgrindの出力を調べている間、その結果をあまりにも速く無視する傾向はありません。かなりの時間を費やした後、valgrindが最初に手がかりを与えたことがわかりますが、それを無視しました。

もう1つのアドバイスは、以前から知られている安定版リリースからのコード変更を比較することです。ある種のソースバージョン管理システム(svnなど)を使用している場合は問題ありません。すべてのメモリ関連機能(memcpy、memset、sprintf、new、delete / delete []など)を調べます。

于 2009-07-25T20:04:06.880 に答える
6

gcc4.1と-fstack-protector-allスイッチを使用してプログラムをコンパイルします。スタックスマッシングによってメモリの破損が発生した場合、これで検出できるはずです。SSPの追加パラメーターのいくつかを試す必要があるかもしれません。

于 2009-07-25T22:11:12.147 に答える
4

皆さん、私はなんとかバグの原因を見つけることができました。ただし、helgrind / DRD / tsanを使用してステージサーバーで検出しました。複数のスレッド間にデータレースがあり、メモリが破損していました。これらのツールは誤検知が多すぎるため、適切なvalgrind抑制を使用することが重要でした。それでも、大幅な速度低下なしに本番サーバーでこれを検出する方法はわかりません...

于 2009-07-31T20:33:11.950 に答える
3

-fmudflapを試しましたか?(数行上にスクロールして、使用可能なオプションを確認してください)。

于 2009-07-25T22:49:59.417 に答える
1

IBM Purifyを試すことはできますが、それはオープンソースではないのではないかと思います。

于 2009-07-25T19:57:11.030 に答える
1

オープンソースであるGooglePerftools---が役立つかもしれません。ヒープチェッカーのドキュメントを参照してください。

于 2009-07-25T20:15:44.063 に答える
1

これを試してみてください: http ://www.hexco.de/rmdebug/ 私はそれを広範囲に使用しました、それはパフォーマンスへの影響が少ないです(それは主にRAMの量に影響を与えます)が、割り当てアルゴリズムは同じです。割り当てのバグを見つけるのに十分であることが常に証明されています。バグが発生するとすぐにプログラムがクラッシュし、詳細なログが記録されます。

于 2009-07-30T05:59:42.273 に答える
1

特定のバグが検出されたかどうかはわかりませんが、MALLOC_CHECK_環境変数(mallocマニュアルページ)は、デフォルトのLinux実装で追加のチェックをオンにしmalloc、通常、実行時のコストはそれほど高くありません。

于 2009-08-02T18:27:20.023 に答える