7 Pythonでのdrgnライブラリの使用

drgnライブラリをインポートして、ライブ・カーネルおよびvmcoreクラッシュ・ダンプをPythonシェルおよびPythonスクリプトでデバッグします。

Pythonスクリプトでdrgnの使用を開始する前に、Pythonがシステムに正しくインストールされていることを確認してください。詳細は、Oracle Linux 8 Pythonのインストールと管理を参照してください。

スクリプトがPython 3.6で実行されている場合は、drgnパッケージもインストールします。詳細は、「drgnのインストール」を参照してください。

ノート:

新しいバージョンのPython 3で実行されるスクリプトでdrgnライブラリをインポートするには、ol8_addonsリポジトリを有効にしてから、パッケージ名にバージョンを指定します。

たとえば、python3.12-drgnパッケージをインストールして、Python 3.12で実行されるスクリプトにdrgnライブラリをインポートできます:

sudo dnf config-manager --enable ol8_addons
sudo dnf install python3.12-drgn

ol8_addons yumリポジトリで一致するパッケージが使用できない場合、そのPythonバージョンはサポートされなくなる可能性があります。詳細は、Oracle Linux: 製品ライフサイクル情報を参照してください。

オプションで、次のコマンドを実行して、インタプリタとしてPython 3.12を指定してdrgnコマンドを実行できます:

python3.12 -m drgn

crashユーティリティとは異なり、drgnはもともとスタンドアロンのカーネル・デバッグ・ツールとして設計されていませんでした。drgnは、スクリプトおよびレビューの目的でデバッグ情報を公開するPythonプログラミング・ライブラリです。

  1. prog配列変数には、デバッグするカーネルに関する情報が含まれています。たとえば、slab_cachesに対して収集されたデータを返すには、drgnシェルで次の文を実行します:
    prog["slab_caches"]
    (struct list_head){
            .next = (struct list_head *)0xffff8b831d972260,
            .prev = (struct list_head *)0xffff8b8007c02060,
    }
  2. 標準python構造体を使用して、デバッグ情報を繰り返し処理することもできます:
    slab_caches = prog["slab_caches"]
    slab_caches.next
    *(struct list_head *)0xffff8b831d972260 = {
            .next = (struct list_head *)0xffff8b831d972460,
            .prev = (struct list_head *)slab_caches+0x0 = 0xffffffff836e3da0,
    }
  3. drgn APIおよびスクリプト構文の詳細は、https://drgn.readthedocs.io/を参照してください。または、Pythonシェルで次のコマンドを実行します:
    help(drgn)

Pythonスクリプトにより、カーネル・デバッグ情報とクラッシュ・データの配列がロードされました。