gdbでのマルチスレッドのデバッグ

Pocket

RedHatのサイトより。gdbでマルチスレッドのプログラムをブレークポイントで止めたときは、すべてのスレッドが止まるって。シングルステップさせたときは、他のスレッドはどこで止まるかわからないんだって。
だから、他のスレッドのブレークポイントに引っかかるとそっちで止まるんだって。
ホストOSのスケジューラをロックできるOSもあって、
(gdb) set scheduler-locking on
で、他のスレッドを実行させないこともできるそうだけど、Windowsは当然できないよね。
(gdb) info threads
で、スレッドの表示。
(gdb) thread threadno
で、threadnoに番号を入れるとスレッドの切り替え。
(gdb) break linespec thread threadno
で、linespecにソースの行番号、threadnoに番号を入れると、そのスレッドがソースの位置に来たときに止まるんだって。
Windowsで、_beginthreadexを使ってスレッドを作ると、なかなかinfo threadsに表示されないです。すぐには実行されないようです。
WaitForSingleObjectで終了待ちをするとやっとスレッドが開始されたりしています。
ところが、本質的にスレッドはプログラム中のどこでスイッチしてもいいわけで。スレッドを複数作ってみると、実行の順序が反対になったりします。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください