Intel の Inspector XE を使用してアプリケーションを実行しています。スレッドの 1 つが別のスレッドのスタックにアクセスしていると表示されますが、どのスレッドが関与しているか、コードのどこで発生しているかはわかりません。
ある種のスレッドごと、またはコンテキスト切り替え中にコードを呼び出す何らかの方法があるのではないかと考えていましVirtualProtect
たが、何も見つかりません。
行為のスレッドをキャッチする方法はありますか、それとも運が悪いのでしょうか?
スレッド作成ルーチンから始めます。渡されたポインタがスタックを指していないことを確認してください。これを支援するためにgrepを使用できるはずです。例えば。pthreads を使用していると仮定するとgrep -E pthread_create\([^,]+\,[^,]+\,[^,]+\,[^&]+\& *.c
、pthread_create 関数呼び出しで & 演算子を使用してポインターが作成された場合、同様のことが原因である可能性があります。
を使用して配列識別子のリストをgrep -E "[[:alnum:]_]+[[:space:]]+[[:alnum:]_]+\[[^]]+]" *.c
作成し、関数内で宣言された配列に基づいてパターンのリストを作成することを検討してください。
それ以外の場合grep -E pthread_create *.c
は、少なくともスレッドを作成する各行と、入口ポイントに渡されるポインターの式を提供します。そのポインターが malloc された構造体またはポインター (例: fubar **argument; argument = malloc(sizeof *argument);
) を指している場合は、その構造体またはポインターが変更されている場所を見つけ、スタックを指すように変更されていないことを確認します。