dtrace: failed to compile script は KERNCONF が原因でも起きる2020年01月10日 14時07分14秒

FreeBSD の CURRENT でカーネルに入れた変更のパフォーマンスを計ってみようと思ったが、dtrace がうまく動かない時があって困っていた。
# dtrace -s time-spent.d
dtrace: failed to compile script time-spent.d: "/usr/lib/dtrace/mbuf.d", line 11
4: failed to copy type of 'm_data': Type information is in parent and unavailable
/usr/lib/dtrace/mbuf.d を見ても何が悪いのか全然判らない。

二、三週間様子を見て気が付いたのが、make installkernel の直後にエラーが出たり消えたりすること。dtrace がコンパイルしていると言うのだから、カーネルのソースコードか生成物を利用していると考えられる。再起動無しで、dtrace のコンパイルの結果が変わる様だ。

その後疑ったのが、KERNCONF。CURRENT の GENERIC はデバッグオプションがいっぱいなので、ほとんどの場合は GENERIC-NODEBUG カーネルを使っている。更に一日に、十数回もカーネルをリンクすることもあるので、特に作業用には更に GENERIC-NODEBUG ファイルで沢山のデバイスを無効にしていた。

作業用カーネルで作ったときは、極小構成だったが、テスト用に別途利用しているカーネルは素の GENERIC-NODEBUG だった。テスト用にも極小構成の KERNCONF を置いた後は dtrace が問題なくコンパイル出来ている。