Devel::Coverって便利な道具なんですが、なんかfork + execするとうまく動きませんでした。ずっと見て見ぬ振りしてたんだけど、そういうわけにもいかなくなったので、二日ほどずっとその挙動をprintデバッグで追いかけていったら大体把握できた。
すごくはしょって言うと、Devel::Coverは裏のXSレベルでEND {} にあたる部分とかにコードを挿入してて、元のコードが
#!perl exec "/bin/ls"
だったとしたら、Devel::Coverをuseすると概念的には
#!perl END { do_interesting_stuff() } exec "/bin/ls"
という事をするようになる。PPの場合だとexec時にこのENDブロックはうまく無視されるんだけど、なんせDevel::Coverは無理矢理この動作を行っているので、ENDに当たる部分がexec()の直前に実行される。そしてもしここでdieとかCレベルでのエラーとかあるとしずかーに落ちてしまう。
ということで、自分の環境では以下のレポジトリの変更でこれが回避できた:
ちなみにこのあたりの修正ナシでTest::mysqldを使ったコードをDevel::Coverすると↑の問題にぶち当たる。本体のほうにも修正してもらうように言うつもりだけど、もし今困ってたらこれでなんとかなるはず。