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> を実行 .list *(unwind_backtrace+0x10) .追加情報については、次のリソースを確認してください:
<オール><ブロック引用>
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)