2012-02-26 9 views
4

私はロックフリーの共有変数クラスを作成しています。私の実装が計画どおりに機能するかどうかを確認するためにSIGSEGVフォールトを生成できます。私はポインタを変更して100回読む関数を作成しようとしました。私は両方のスレッドでこの関数を呼び出して、スレッドを自分のプログラム内で無限に実行させます。これは私が望むエラーを生成しません。これを行うにはどうしたらいいですか?C++デバッグ目的のためにSIGSEGVを作成する

編集 私はすべてのセグメンテーションフォールトを処理しませんが、私はロックを削除した場合、彼らは私のプログラムで生成されます。私は、ロックレスデザインを使用したいので、私はCASを使用してロックレスな共有変数クラスを作成しました。 segfaultsを生成するコードがあるので、クラスを使って問題を解決できるかどうかを確認する方法はありますか?無効なポインタデリファレンス

+3

一体何を?あなたはSIGSEGVで何をしようとしますか?これはまったく意味がありません。あなたが解決しようとしている問題を教えてください。セグメンテーション障害を傍受して破棄することによって問題に対応しようとするプログラムを作成しましたか?これはあなたに全く関係しませんか? 「これをやるにはどうしたらいいですか?」ターン180度は第1ステップです。 –

+1

@LightnessRacesinOrbit私は、クライアントがsegfaultで生き残ることができる共有メモリアプリケーション(クライアントがsegfaultであればクリーンアップさせることによって)が合理的なアプリケーションだと思います。ラインの間を読んで、これはOPがやっているように聞こえる。 – James

+3

@Lightness:例外セーフスマートポインタを作成しようとしていた場合、例外が発生したときにユニットテストの動作をしなければならないと思いませんか?これは同様の考えのようです。 –

答えて

1

*((int*)0x8100000000000000) = 5; 
+2

これはどのようにSIGSEGVを保証するか説明してください。 –

+0

@LightnessRacesinOrbit質問に言葉の保証は言及されていませんでしたが、あなたが尋ねたので、今度はカーネルAPIを使って保証されているように保証されます。 – James

+2

IMO、OPが "私はそれが13.6%の症例でしか働きたがっています"と述べていない限り、「保証されている」と暗示されています。 –

9
#include <signal.h> 

raise(SIGSEGV); 

適切な信号が発生することになります。

+0

無効なポインタを間接的に逆参照するような信号を生成する必要があります。 – RaptorIV

+0

@RaptorIV:信号を生成する理由を説明する理由を説明してください。 –

+0

は、マルチスレッドプログラムがそれを引き起こしたように、実際の環境で生成する必要があります。私はクラスを実装するときにそれが存在しないかどうかを確認することができます。 – RaptorIV

2

(少なくとも私のシステム上で)割り当てられていないメモリへのポインタをDerefencing:

int *a; 
*a = 0; 
関連する問題