私は多くのプログラミングを行いましたが、C はあまり使用していません。デバッグについてアドバイスが必要です。マルチスレッド プログラム (OS X 10.4 で pthreads を使用) を実行してから約 10 ~ 100 秒後に、静的変数 (ファイル スコープ) が破壊されています。私のコードは次のようになります。
static float some_values[SIZE];
static int * addr;
addr
しばらくの間有効なメモリアドレスを指し、その後何らかの値 (0 の場合もあればゼロ以外の場合もある) で上書きされ、逆参照時にセグメンテーション違反が発生します。をいじってみると、期待どおりに がメモリ内に配置されgdb
ていることが確認されたので、最初に推測したのは、範囲外のインデックスを使用して に書き込んだということです。ただし、これは小さなファイルなので、問題がないことを簡単に確認できます。addr
some_values
some_values
明らかなデバッグ手法は、変数にウォッチポイントを設定することですaddr
。しかし、そうすると、 で不規則で不可解な動作が発生するようですgdb
。ウォッチポイントは、への最初の割り当てでトリガーされaddr
ます。その後、実行を続行すると、すぐに別のスレッドで無意味なセグメンテーション違反が発生します...おそらく、プログラムの別の部分で静的変数のアドレスにアクセスする際のセグメンテーション違反です! しかし、gdb
そのメモリ アドレスを対話的に読み書きできるようにします。
プログラムは信号 EXC_BAD_ACCESS を受信しました。メモリにアクセスできませんでした。 理由: アドレス: 0x001d5bd0 の KERN_PROTECTION_FAILURE mainloop.c:39 の受信 (arg=0x0) で 0x0000678d 39 sample_buf_cleared ++; (gdb) p &sample_buf_cleared $17 = (int *) 0x1d5bd0 (gdb) p sample_buf_cleared $18 = 1 (gdb) sample_buf_cleared = 2 を設定 (gdb)
gdb
明らかに混乱しています。誰かが理由を知っていますか?または、ウォッチポイントを使用せずにこのバグをデバッグするための提案はありますか?