Logo
出典: drgn.readthedocs.io

drgn 0.3で加わった主な変更

Metaで開発されているオープンソースのデバッガー「drgn」が、バージョン0.3になりました。Linuxカーネルの解析機能を拡充し、信頼できないデバッグ情報やコアダンプを扱う際の安全性も強化しています。

QEMU上の仮想マシンを調べる際、可能な場合はQEMUプロセスからメモリーを直接読み取るようになりました。

新たにLinux 7.2と7.3をサポートし、LoongArch64アーキテクチャも認識するようになりました。IRQ数を取得する関数や、crash互換コマンドのBPF表示オプション、部分実装のnetコマンドも追加されています。

Pythonでカーネルの状態を調べる仕組み

drgnはPythonからプログラムの型や変数を扱えるデバッガーです。Linuxカーネルの場合、カーネルのメモリーやコアダンプを読み、vmlinuxのDWARFデバッグ情報を使ってデータ構造を解釈します。

たとえばPythonスクリプトでカーネル内のモジュール一覧をたどり、参照カウントが一定値を超えるモジュール名を表示できます。カーネルの内部データをスクリプトから条件に応じて調べられるため、繰り返し行う確認をコードにできます。

LinuxカーネルのBPF用ツールでは、稼働中のBPFプログラムやマップを列挙し、ID、種類、名前などを表示できます。開発者はスクリプトを変更して、特定プログラムの内部構造を出力するようにもできます。

crashやGDBとの用途の違い

drgnはLinuxカーネルの複雑な状態をPythonで調べる用途を重視し、従来のcrashユーティリティに代わる選択肢として開発されました。今回の更新では、crashのBPFコマンドに構造体表示のオプションが加わり、netコマンドも一部実装されています。

GDBはPythonスクリプトに対応しています。Linuxカーネルのデバッグでは、QEMU/KVMのデバッグ対象へ接続し、ブレークポイントやカーネルログ、タスク情報を調べる手順があります。GDBのヘルパースクリプトは、実行中のカーネルを止めて追跡するデバッグにも使われます。

drgnは/proc/kcoreやvmcoreからメモリーを読み、デバッグ情報を使ってデータを調べます。Pythonでデータ構造をたどる解析や、独自の調査スクリプトを作る用途が中心です。QEMUのメモリーを直接読む0.3の改善も、この用途に関わります。

0.3で強化された安全性と互換性

0.3では、DWARFやELFなどの不正なデータに遭遇した場合に使う例外型が整理されました。また、深く入れ子になった型や循環する型などが引き起こす過剰な再帰も制限されています。

リリースでは、バッファーオーバーフロー、範囲外アクセス、ヌルポインター参照、解放後使用などのメモリー安全性の問題も修正されました。細工された入力で発生する問題も含まれると、drgnの開発者は説明しています。

このほか、カーネルダンプやユーザー空間のコアダンプの処理、複数アーキテクチャーのアドレス変換、シンボル解析など、多数の不具合が修正されました。