4

私はPOSIXスレッドを使用しており、プログラムの最後に、各スレッドに参加するのを待っています。完全にうまく実行された後、スレッドを待っているときにコードが奇妙なバグを返し始めました。

pthreads threads[C+P];

for(i = 0; i < (C+P); i++)
{
    printf("%d\n", i);  
    pthread_join(threads[i]);
}

printfステートメントを削除するか、他のprintfステートメント、遅延、またはiでの他の操作に置き換えると、セグメンテーション違反が発生します。

これをデバッグするにはどうすればよいですか?

4

1 に答える 1

7

呼び出しを挿入printf()すると、メモリレイアウト(したがって、偶然にメモリの破損がマスクされる可能性があります)と実行タイミング(スレッドを使用するため、タイミングも関係します)に影響します。

ただし、推測を行う代わりに、定期的にデバッグを行う必要があります。

  • gdbで実行可能ファイルを実行すると、クラッシュの原因となっている正確な操作や、どこから呼び出されているかなどを確認できるはずです。

  • valgrindの下で実行します-このツールは、解放されたメモリブロックへのアクセス、初期化されていない変数の使用、配列/バッファの境界の超過など、多くの一般的なエラーを検出します。エラーの正確な位置をすぐに取得することは珍しくありません。valgrind強くお勧めしますそれ!

于 2012-11-08T00:54:48.927 に答える