3

プロセスがそのメモリページの1つをLinux上の特定のスレッドセットに対して書き込み不可としてマークする方法はありますか?

バックグラウンド

OpenMPで強化されたC++アプリケーションでトリッキーなポインターの問題をデバッグしようとしています。私が観察する動作は、プログラムがランダムな時間の後にsegfaultすることです。バイナリを指定すると、常に同じ場所でセグメンテーション違反が発生しますが、バイナリを変更すると(コードをコメントアウトするか、コンパイルオプションを変更することにより)、セグメンテーション違反の原因となるコード行が変更されます。各OpenMPスレッドで行われる作業は簡単です。

gdbを使用してsegfaultingスレッドのスタックを検査すると、NULLに近いアドレスを指すように破損している単一のポインターが観察されます。ポインタ変数はスタック上にあり、ヒープアドレスを指します。スタックオーバーフローの問題や、あるスレッドが別のスレッドを歩いている他のケースがないことを確認するために、各OpenMPスレッドにそのスタックを他のすべてのスレッドに対して書き込み不可としてマークさせたいと思います。

大きな値(たとえば10M)に設定OMP_STACKSIZEすると問題は解決しますが、これは幸運だと思います。私が知る限り、私はどのスレッドにも<<100Kのスタックスペースを使用しています。

valgrindのmemcheckは問題を報告しません。

すべてのメモリ割り当ては、メインスレッドのシングルスレッドコードで実行されます。競合状態が不適切に処理された場合、出力は正しくなくなりますが、ポインターの問題は発生しません。

編集:最終的に、私は自分のバグを見つけました。遅延評価のためにconst、メンバーを持つクラスのインスタンスを使用していました。mutable privateそのmutableメンバーから発生する競合状態がありました。解決策は、並列ブロックに入る前に熱心な評価をトリガーすることでした。タイトルの質問に関しては、@Damonのコメントは正しいと思います。

4

0 に答える 0