1. 程式人生 > >利用GDB工具定位kernel Oops錯誤

利用GDB工具定位kernel Oops錯誤

錯誤log:

[   55.132887] Unable to handle kernel paging request at virtual address 0000676d
[   55.140503] pgd = c0004000
[   55.143278] [0000676d] *pgd=00000000
[   55.147001] Internal error: Oops: 5 [#1] PREEMPT SMP
[   55.152084] Modules linked in: ssd1306 rtk_btusb
[   55.156985] CPU: 1    Tainted: G        W    (3.0.35-gcbc3f7a4c9f-dirty #43)
[   55.164158] PC is at i2c_smbus_xfer+0x8/0x564


[   55.168580] LR is at i2c_smbus_read_byte_data+0x58/0xac
[   55.173922] pc : [<c0413964>]    lr : [<c04141d0>]    psr: 200f0013
[   55.173927] sp : d4057eac  ip : d4057ee6  fp : 00000089
[   55.185587] r10: c0046840  r9 : 00007069  r8 : c0a04b5c
[   55.190874] r7 : d4725000  r6 : c09b4440  r5 : 00000008  r4 : c0878290
[   55.197517] r3 : 00000001  r2 : 00005f66  r1 : 00007069  r0 : 00006765
[   55.204111] Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
[   55.211536] Control: 10c53c7d  Table: 2082404a  DAC: 00000015

上面紅字“PC is at i2c_smbus_xfer+0x8/0x564”說明,PC指標指向出問題函式的地址,出問題的函式是i2c_smbus_xfer,那他的地址是多少呢?

找到System.map所在位置,執行如下命令

[email protected]:~/android-work/kernel_imx$ grep i2c_smbus_xfer ./System.map

c041395c T i2c_smbus_xfer
c08b18d0 r __ksymtab_i2c_smbus_xfer
c08bc21c r __kcrctab_i2c_smbus_xfer
c08d220d r __kstrtab_i2c_smbus_xfer

這句日誌最後[   55.164158] PC is at i2c_smbus_xfer+0x8/0x564, 0x564是i2c_smbus_xfer函式的大小,0x8是i2c_smbus_xfer函式的地址偏移。

結合錯誤日誌c041395c就是i2c_smbus_xfer的地址,i2c_smbus_xfer+0x8即0xc041395c+0x8=0xc0413964,這就對上了這句話:[   55.173922] pc : [<c0413964>]    lr : [<c04141d0>]    psr: 200f0013

下面用GDB工具具體定位:

[email protected]:~/android-work/kernel_imx$ gdb ./vmlinux
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./vmlinux...done.
(gdb) b *0xc0413964
Breakpoint 1 at 0xc0413964: file drivers/i2c/i2c-core.c, line 2098.

(gdb)