5

組み込み Linux 環境 (PowerPC でカスタマイズされた 2.4.25) では、数時間後に次のカーネル パニックが発生します。

Oops: kernel access of bad area, sig: 11
NIP: C9471C7C XER: 20000000 LR: C0018C74 SP: C0198E20 REGS: c0198d70 TRAP: 0800    Not tainted
MSR: 00009030 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11
DEAR: C9876FFF, ESR: 00000000
TASK = c0197020[0] 'swapper' Last syscall: 120
last math 00000000 last altivec 00000000
PLB0: bear= 0x48041040 acr=   0x00000000 besr=  0x00000000
PLB0 to OPB: bear= 0x00cc1000 besr0= 0x00000000 besr1= 0x00000000

GPR00: 00000000 C0198E20 C0197020 00000000 C016E494 000000C2 C01D0000 00000000
GPR08: C98701F0 C9876FFF 00008000 C768AE0F 24004022 1001B120 07FC9500 00000000
GPR16: 00000001 00000001 FFFFFFFF 007FFE00 00001032 00198EE0 00000000 C0004780
GPR24: C01D2F68 C01E0000 C0170000 C0170000 C01B0000 C9473870 00000000 C9473864
Call backtrace:
00000001 C0018C74 C0018A1C C0005E14 C0004780 C0022724 C0005D4C
C0005D60 C0002430 C01AE5BC C0002328
Kernel panic: Aiee, killing interrupt handler!
In interrupt handler - not syncing
 <0>Rebooting in 1 seconds...

猫 /proc/モジュール:

CustomModule1          10556   4
CustomModule2           5488   0
CustomModule3          10240   1
fuse                   35576   4
usb-storage            28468   0 (unused)
keybdev                 3076   0 (unused)
mousedev                6116   0 (unused)
hid                    17968   0 (unused)
input                   6192   0 [keybdev mouse

ksyms -m:

Address   Symbol                 Defined by
c9471000  (11k)                  [CustomModule1]
c9471b74  functionA              [CustomModule1]
c947358c  functionB              [CustomModule1]
c9473580  functionC              [CustomModule1]
...

グーグルで助けを求めましたが、役立つものが見つかりませんでした。A もバックトレースを「デコード」したかったのですが、その方法がわかりません.... アドレスが System.map のアドレスに対応していません。エラーを見つける方法を誰かに説明してもらえますか?

ありがとう、クリス

4

2 に答える 2

4

NIPは、次の命令ポインター、またはより一般的にはプログラムカウンター(別名PC)であり、カーネルがどこで動作するかを示します。ksymsの出力によると、NIP0xC9471C7C)の内容はにあるように見えますfunctionAfunctionAモジュールでobjdump-Sを使用して、にある命令を把握できるはずですfunctionA+0x108

リンクレジスタ(LR)は、現在の関数のリターンアドレスを保持し、の呼び出し元を示しますfunctionA。System.mapファイルを調べてこのアドレスを含む関数を見つけるか、vmlinuxイメージでGNUbinutilsプログラムaddr2lineを使用して同じ情報を取得できます。そこから、何がおっとを引き起こしたのかをよりよく理解できるはずです。

PPCレジスタとアセンブリの詳細については、ここここを参照してください。

于 2009-06-02T16:48:39.117 に答える
1

設定オプション CONFIG_KALLSYMS はこのカーネルで利用できますか? そうであり、カーネルを再コンパイルできる場合は、シンボリック情報を含む oops を取得する必要があります。

コメントで指摘されているように、Linux 2.4 には kallsyms がないため、frame_pointer と CONFIG_DEBUG を有効にする必要があります。backtrace と system.map は仮想アドレスであり、一致している必要があります。それらは完全に一致しない場合がありますが、どのシンボルが最も近いかを見つけることができます。

たとえば、バックトレース出力では、 C0018C74 and C0018A1Cカーネル コード アドレスのように見えますが、C9xxxxxx の範囲はカーネル アドレスのようには見えません。カーネルモジュールをリンクできる場所ですか?

system.map の最後にいくつかの行を投稿してください

編集: ksyms の出力から、カスタム モジュールの FunctionA で障害が発生しているようNIP C9471C7Cですc9471b74

  • NIPは次の命令ポインターの略です
  • c9471b74 は、ksyms の出力によると、FunctionA の開始アドレスです。

LR はリンク レジスタ、つまり通常は戻りアドレスが格納されるレジスタです。

于 2009-05-28T08:24:19.130 に答える