Linux のプロセスが呼び出しているシステムコールを確認する方法としては strace(1) コマンドが幅広く知られています。

質問では read(2)write(2) を呼び出したあとにどのような関数が呼ばれているのかを知りたい、ということのようですが strace(1)-k オプションを用いることでスタックトレースを確認できますので、どんな共有ライブラリによってシステムコールの発行があったかなどを確認することができます。どこを経由してシステムコールを呼び出しているかが分かるので役立つと思います。

カーネルの中を追いかける方法については カーネル空間までコード追っていこう@Linux | Technology | KLablog | KLab株式会社 のような記事が参考になると思います。

さらに kgdb(1) を使えばユーザ空間のプロセスを gdb(1) で追いかけるようにカーネルの動作を追いかけることができますが、上記の記事に書かれているような手順と不満があります。

カーネルビルドしなきゃいけないし、grub書き換えなきゃいけないし、なぜかbreak point効かない場所あるし、時々落ちるし。

私も上の意見と同じくこの方法はとても面倒だと感じています。

私のおすすめは User Mode Linux を使って gdb(1) で追いかける方法です。

User Mode Linux HOWTO : Kernel debugging

YouTube に実際に UML を使ってカーネルのデバッグをしている動画がありましたので、参考になるのではないかと思います。

本物のカーネルを kgdb(1) でデバッグしているときに動作の不具合が生じると再起動となってしまいますが、User Mode Linux はユーザ空間で動作している普通のプロセスになりますので、作業環境そのものは再起動する必要はなく User Mode Linux プロセスを再起動すればすぐに作業を再開できるという点でもおすすめです。

注意点としては、私が最後にこの方法を試したのはかなり昔(15年くらいまえ)なので、現在では勝手が少し異なる部分などもあるかもしれません。

私からはカーネルのデバッグについての回答になりましたが、ファイルシステムに詳しい方にご意見を伺えば、また違った方法や効果的な方法が得られるかもしれません。

少し長くなりましたが何かの参考になればさいわいです。

1年

利用規約プライバシーポリシーに同意の上ご利用ください

takano32さんの過去の回答
    Loading...