0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Illegal instruction (core dumped) の対処メモ

Posted at

概要

アホなミスで数時間詰まったので備忘録。

C でマルチスレッドのプログラムを作成し、実行したところ、

Illegal instruction (core dumped)

というエラーが発生した。

原因は、存在しないスレッドのハンドルを取得しようとしたためだった。

具体的には、定義していない関数のポインタを、pthread_create() に渡していたことが原因であった。定義したら直った。

詳細

スレッド作成について

hoge という関数のスレッドを作成する時は、↓の手順を踏む。

pthread_t hoge_thread; // pthread_create に渡すヤツ.

void *hoge(void *fuga); // プロトタイプ宣言.

// 定義.
void *hoge(void *fuga){
   int i = 0;
   while(i < 10){
      printf("fuga\n");
      sleep(1);
   i++;
   }
   return NULL;
}

// スレッド作成.
if(pthread_create(&hoge_thread, NULL, hoge, NULL)){
   perror(hoge_thread create failed\n);
   exit(EXIT_FAILURE);
}


if(pthread_join(&hoge_thread, NULL)){
   perror(hoge_thread create failed\n);
   exit(EXIT_FAILURE);
}

問題発生時

Illegal instruction (core dumped) とやらが発生した時は、上記サンプルコードにおける「定義」が抜けていた。

この状態で gdbserver によるデバッグを実行すると、

Cannot get thread handle for LWP 505: generic error

というエラーが発生した。

スレッドの定義をしていないのだから、ハンドラの取得に失敗するのも当然である。

解決

関数を定義したら出なくなった。

やったー!

まとめ

マルチスレッド時は、エディタ上で関数のプロトタイプ宣言部分を確認し、関数が未定義のままじゃないかチェックしよう、ヨシ!

ちなみに未定義だと↓のようになんか点線が入る。

247942504-9157870d-3904-47e3-8c7b-fbef97a2de5d.png

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?