Oops快速定位代码行方法
2017-04-18 19:24
309 查看
原址
Oops 是内核调式中常见的错误之一,尽管Oops出错的时候会打印出堆栈和函数调用关系,但是要定位到哪一行代码,如果仅仅从打印来看,需要不断的增加打印信息来调式,往往事倍功半,这里以举一个例子,Oops的快速定位办法:
arm-linux-gdb
必须具备gdb调式命令,如果没有,可以到 http://www.sourceware.org/gdb/ 上,下载并编译
Kernel Debugging
-> Compile the kernel with debug info 该选项选中
[ERR][src/ipresolve.c #684]: total sendlen =102
Unable to handle kernel NULL pointer dereference at virtual address 00000082
pgd = c3b50000
[00000082] *pgd=c3f3c031, *pte=00000000, *ppte=00000000
Internal error: Oops: 1 [#1]
Modules linked in:
CPU: 0 Not tainted (2.6.27.18-WR3.0bg_small-dirty #658)
PC is at iscsi_eh_cmd_timed_out+0x1c/0xd0
LR is at scsi_times_out+0x30/0xa4
pc : [] lr : [] psr: a0000013
sp : c03ebe68 ip : c03ebe80 fp : c03ebe7c
r10: c0410be8 r9 : c03f0348 r8 : c03ea000
r7 : c01b3bc0 r6 : c03ebea8 r5 : 00000100 r4 : c0550a80
r3 : c36e5400 r2 : 00000002 r1 : c0aa34e0 r0 : c0550a80
Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: 0001317f Table: c3b50000 DAC: 00000017
Process swapper (pid: 0, stack limit = 0xc03ea268)
直接使用arm-linux-gdb vmlinux
然后 使用命令跳转
l * iscsi_eh_cmd_timed_out+0x1c
就能定位到出错的行
Oops 是内核调式中常见的错误之一,尽管Oops出错的时候会打印出堆栈和函数调用关系,但是要定位到哪一行代码,如果仅仅从打印来看,需要不断的增加打印信息来调式,往往事倍功半,这里以举一个例子,Oops的快速定位办法:
1.首先确认,你的编译工具链中有
arm-linux-gdb必须具备gdb调式命令,如果没有,可以到 http://www.sourceware.org/gdb/ 上,下载并编译
2.确认你的内核选项中
Kernel Debugging-> Compile the kernel with debug info 该选项选中
3.编译内核保留 内核根目录下的 vmlinux 备用
4. 对于产生的Oops 日志
[ERR][src/ipresolve.c #684]: total sendlen =102Unable to handle kernel NULL pointer dereference at virtual address 00000082
pgd = c3b50000
[00000082] *pgd=c3f3c031, *pte=00000000, *ppte=00000000
Internal error: Oops: 1 [#1]
Modules linked in:
CPU: 0 Not tainted (2.6.27.18-WR3.0bg_small-dirty #658)
PC is at iscsi_eh_cmd_timed_out+0x1c/0xd0
LR is at scsi_times_out+0x30/0xa4
pc : [] lr : [] psr: a0000013
sp : c03ebe68 ip : c03ebe80 fp : c03ebe7c
r10: c0410be8 r9 : c03f0348 r8 : c03ea000
r7 : c01b3bc0 r6 : c03ebea8 r5 : 00000100 r4 : c0550a80
r3 : c36e5400 r2 : 00000002 r1 : c0aa34e0 r0 : c0550a80
Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: 0001317f Table: c3b50000 DAC: 00000017
Process swapper (pid: 0, stack limit = 0xc03ea268)
直接使用arm-linux-gdb vmlinux
然后 使用命令跳转
l * iscsi_eh_cmd_timed_out+0x1c
就能定位到出错的行
相关文章推荐
- linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法
- linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法
- linux设备驱动第四篇:以oops信息定位代码行为例谈驱动调试方法
- 定位Oops的具体代码行分析死机日志的方法
- linux设备驱动第四篇:以oops信息定位代码行为例谈驱动调试方法
- linux设备驱动第四篇:以oops信息定位代码行为例谈驱动调试方法
- linux设备驱动程序第四部分:从如何定位oops对代码的调试方法,驱动线
- [转]MS-VC 使用MAP文件快速定位程序崩溃代码行(转贴)
- 使用MAP文件快速定位程序崩溃代码行(转)
- 在RELEASE版本中快速定位DATA ABORT的方法
- 使用MAP文件快速定位程序崩溃代码行(转)
- 内存泄漏快速定位方法
- MS-VC 使用MAP文件快速定位程序崩溃代码行
- 使用MAP文件快速定位程序崩溃代码行
- 定位oops的具体代码行
- Linux 快速定位web路径方法
- 定位Oops的具体代码行
- 定位Oops的具体代码行
- 在RELEASE版本中快速定位DATA ABORT的方法 --zt