読者です 読者をやめる 読者になる 読者になる

kmemleakめも

linux kernel

c⌒っ゜д゜)っφ メモメモ...
kmemleakはlinuxカーネルのメモリリークを発見するための機能ですね。
linuxカーネルも3.6-rc1が出たのと、fedoraのrawhideで有効になってる機能も入れておきたかったのでrawhideのkernel-3.6.0-0.rc0.git9.3.fc18.x86_64.rpmに入っている.configベースにmake menuconfigしました。
rawhideのカーネルのコンフィギュレーションはstable版と違ってデバッグ関連の機能が有効になってます。例えば、rawhideではCONFIG_DEBUG_KMEMLEAKがyになってるけど、f17のカーネルではnになっているとかです。

それでちょっとハマったのは新しいカーネルで起動したら/sys/kernel/debug/kmemleakがなかったんですよね、kmemleakの機能は.configのレベルでは有効になっているのに… それでdmesgで何かメッセージが出てないか確認したら「Kernel memory leak detector disabled」と出てました。何かしらの原因で無効にされているなーと思いつつ.configを確認してみたらCONFIG_DEBUG_KMEMLEAK_DEFAULT_OFFがyになってました。このため機能としては有効だけど、実行時に無効になったということですorz
ということで、これをnにしてリビルド・再起動したのですが、まだkmemleak使えず/(^o^)\ dmesg見たらmm/kmemleak.cのここの部分のメッセージが出てました。

        if (crt_early_log >= ARRAY_SIZE(early_log))
                pr_warning("Early log buffer exceeded (%d), please increase "
                           "DEBUG_KMEMLEAK_EARLY_LOG_SIZE\\n", crt_early_log);

そんなわけで指示通りにCONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZEの数値を1024から4096に変えてリビルド・再起動。
そうしたらやっとkmemleakが普通に動くようになりましたヽ(・∀・ )ノ キャッ キャッ

最終的にはこんな設定になってます。

CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4096
# CONFIG_DEBUG_KMEMLEAK_TEST is not set
# CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF is not set

同じようなことは前にも調べたはずだけど色々忘れていた部分もあるのでメモ書きしておきました( ..)φカキカキ