GNU/Linux >> Linux の 問題 >  >> Linux

Linux カーネル パニックを読み取り、理解し、分析し、デバッグする方法は?

addr2line の 2 つの代替案を次に示します。 .適切なターゲットのツールチェーンがあると仮定すると、次のいずれかを実行できます:

objdump を使用 :

<オール>
  • vmlinux を見つけます または .ko ファイルをカーネル ルート ディレクトリの下に置き、オブジェクト ファイルを逆アセンブルします:

    objdump -dS vmlinux > /tmp/kernel.s
    
  • 生成されたアセンブリ ファイル /tmp/kernel.s を開きます . vim などのテキスト エディタで . unwind_backtrace+0x0/0xf8 に移動 、つまり unwind_backtrace のアドレスを検索します + offset .最後に、ソース コードで問題のある部分を特定しました。

  • gdb を使用 :

    IMO、さらにエレガントなオプションは、唯一無二の gdb を使用することです .ホスト マシンに適切なツールチェーンがあると仮定します。

    <オール>
  • gdb <path-to-vmlinux> を実行 .
  • gdb のプロンプトで実行:list *(unwind_backtrace+0x10) .
  • 追加情報については、次のリソースを確認してください:

    <オール>
  • カーネル デバッグのコツ
  • Gdb を使用した Linux カーネルのデバッグ

  • <ブロック引用>

    unwind_backtrace+0x0/0xf8 で 何 +0x0/0xf8

    最初の数字 (+0x0 ) は 関数の先頭からのオフセット です (unwind_backtrace この場合)。 2 番目の数字 (0xf8 ) は 関数の全長 です .これら 2 つの情報が与えられた場合、障害が発生した場所について既に予感があれば、これで疑いを確認するのに十分かもしれません (機能のどこまで進んでいたかを (大まかに) 知ることができます)。

    対応する命令の正確なソース行を取得するには (通常、直観よりも優れています)、addr2line を使用します。 または他の回答の他の方法。


    これは単なる通常のバックトレースであり、これらの関数は逆の順序で呼び出されます (最初に呼び出された関数は前の関数によって呼び出されます):

    unwind_backtrace+0x0/0xf8
    warn_slowpath_common+0x50/0x60
    warn_slowpath_null+0x1c/0x24
    ocal_bh_enable_ip+0xa0/0xac
    bdi_register+0xec/0x150
    

    bdi_register+0xec/0x150 は、シンボル + オフセット/長さです。詳細については、カーネル Oop の理解とカーネル Oop のデバッグ方法を参照してください。また、カーネルのデバッグに関するこの優れたチュートリアルもあります

    注:Eugene によって以下に提案されているように、最初に addr2line を試してみることをお勧めします。ただし、デバッグ シンボルを含むイメージが必要です。たとえば、

    addr2line -e vmlinux_with_debug_info 0019594c(+offset)


    Linux
    1. Linux環境変数:LinuxVPSでの読み取りと設定の方法

    2. Linuxカーネルパニックを処理する方法

    3. Linuxデスクトップでカーネルをアップグレードする方法

    1. Linux – LinuxでサスペンドからRAMへの問題をデバッグする方法は?

    2. Linux カーネルのライブ デバッグ、それはどのように行われ、どのツールが使用されていますか?

    3. GDB と QEMU を使用して Linux カーネルをデバッグするには?

    1. Linux カーネルモジュールのコーディング方法は?

    2. Linux の man ページの読み方は?

    3. パニック時にリブートするように Linux カーネルを早期に構成する方法は?