メインスレッドがすーっと音もなくいなくなる問題

Mosh で特定のマルチスレッドプログラムにおいて、メインスレッドが音もなくいなくなる問題に遭遇。
SEGV や Signal ではない。
デバッグに苦慮していたのだが、kosaki さんに

普通、痕跡を残さないのはexitかassert経由のabort。そのへんにブレークポイントはってみたら?

とアドバイスを頂いた。


アドバイスは的中。 assert で exit してた。
なぜ痕跡が無かったかというと
assert の直前に stderr/stdout が close されていたから。
そもそも

  • stderr/stdout が close されるのはバグ
  • そういったありえない事態を検知するために assert を入れていた

のだが、よく考えれば assert は stderr がなかったらつらいよなあ。


そんなわけで、ようやくまともに動いてきた。結果的には、ほとんどの問題が static 周りだった。

  • static initializer
  • static char buf[N]

とか。static がトラウマになりそうだ。