3

トリッキーなメモリ破損バグ (メモリがランダムに上書きされる) を診断するために、Electric Fence といくつかのカスタム mprotect 呼び出しを利用して、破損したデータ構造に書き込みたい場合にのみ書き込み可能にすることを考えました (そしてすぐに取得します)。書き込みが試みられたときの SIGSEGV)。

残念ながら、上記のコードは Ruby C 拡張機能であるため、libefence の下で Ruby インタープリター全体を実行する際に libefence の下で実行することはパフォーマンス上の悪夢となります。

export LD_PRELOAD=libefence.so.0.0

恐ろしく遅いです。

OTOH、ルビー拡張機能を libefence に直接リンクしても (リンカーに -lefence を渡すことによって)、libefence のインスツルメンテーションなしで実行する効果はないようです。

libefence を介して特定の共有ライブラリで発生するメモリ割り当てのみを実行し、他の共有ライブラリとメイン プロセスをそのままにしておく方法はありますか?

4

1 に答える 1

1

最も簡単な方法は、Ruby C 拡張機能を静的な libefence ライブラリにリンクすることです。ただし、まだ問題がある可能性があります。何かが拡張機能で malloc() されているが、Ruby 内で解放されている場合はどうなるでしょうか?

SIGSEGV をすぐに取得するが速度が必要な場合は、gdb を使用することをお勧めします。SIGSEGV が発生するとすぐに、デバッガーが壊れます。

あるいは、valgrind はメモリの問題を見つけるのに適していますが、低速でもあります。

于 2010-10-13T23:10:36.930 に答える