***本記事にはプロモーションが含まれています。***
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で終了待ちをするとやっとスレッドが開始されたりしています。
ところが、本質的にスレッドはプログラム中のどこでスイッチしてもいいわけで。スレッドを複数作ってみると、実行の順序が反対になったりします。