51

次のLinuxカーネルダンプスタックトレースを検討してください。たとえば、次のように呼び出すことで、カーネルソースコードからパニックを引き起こすことができますpanic("debugging a Linux kernel panic");

[<001360ac>] (unwind_backtrace+0x0/0xf8) from [<00147b7c>] (warn_slowpath_common+0x50/0x60)
[<00147b7c>] (warn_slowpath_common+0x50/0x60) from [<00147c40>] (warn_slowpath_null+0x1c/0x24)
[<00147c40>] (warn_slowpath_null+0x1c/0x24) from [<0014de44>] (local_bh_enable_ip+0xa0/0xac)
[<0014de44>] (local_bh_enable_ip+0xa0/0xac) from [<0019594c>] (bdi_register+0xec/0x150)
  • unwind_backtrace+0x0/0xf8何の略+0x0/0xf8ですか?
  • のCコードを確認するにはどうすればよいunwind_backtrace+0x0/0xf8ですか?
  • パニックの内容をどのように解釈しますか?
4

3 に答える 3

48

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

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はシンボル+オフセット/長さです。カーネルOopsの理解と、カーネルoopsをデバッグする方法についての詳細があります。また、カーネルのデバッグに関するこの優れたチュートリアルもあります

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

addr2line -e vmlinux_with_debug_info 0019594c(+offset)

于 2012-11-20T07:30:33.877 に答える
20

の2つの選択肢がありaddr2lineます。適切なターゲットのツールチェーンがあると仮定すると、次のいずれかを実行できます。

使用objdump

  1. vmlinuxまたはファイルをカーネルルートディレクトリの下に配置.koし、オブジェクトファイルを逆アセンブルします。

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

使用gdb

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

  1. を実行しますgdb <path-to-vmlinux>
  2. gdbのプロンプトで実行します:list *(unwind_backtrace+0x10)

詳細については、次のリソースを確認してください。

  1. カーネルデバッグの秘訣
  2. Gdbを使用したLinuxカーネルのデバッグ
于 2013-04-23T18:04:29.713 に答える
14

unwind_backtrace+0x0/0xf8+0x0/0xf8略ですか?

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

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

于 2015-05-23T23:05:15.593 に答える