Oops快速定位代码行方法

 原址

    Oops 是内核调式中常见的错误之一,尽管Oops出错的时候会打印出堆栈和函数调用关系,但是要定位到哪一行代码,如果仅仅从打印来看,需要不断的增加打印信息来调式,往往事倍功半,这里以举一个例子,Oops的快速定位办法:

1.首先确认,你的编译工具链中有

    arm-linux-gdb

    必须具备gdb调式命令,如果没有,可以到 http://www.sourceware.org/gdb/ 上,下载并编译

2.确认你的内核选项中

  
  
  1. Kernel Debugging
  2.        -> Compile the kernel with debug info  该选项选中​

3.编译内核保留 内核根目录下的 vmlinux 备用

4. 对于产生的Oops 日志

  
  
  1. [ERR][src/ipresolve.#684]: total sendlen =102
  2. Unable to handle kernel NULL pointer dereference at virtual address 00000082
  3. pgd = c3b50000
  4. [00000082] *pgd=c3f3c031, *pte=00000000, *ppte=00000000
  5. Internal error: Oops: 1 [#1]
  6. Modules linked in:
  7. CPU: 0    Not tainted  (2.6.27.18-WR3.0bg_small-dirty #658)
  8. PC is at iscsi_eh_cmd_timed_out+0x1c/0xd0
  9. LR is at scsi_times_out+0x30/0xa4
  10. pc : []    lr : []    psr: a0000013
  11. sp : c03ebe68  ip : c03ebe80  fp : c03ebe7c
  12. r10: c0410be8  r9 : c03f0348  r8 : c03ea000
  13. r7 : c01b3bc0  r6 : c03ebea8  r5 : 00000100  r4 : c0550a80
  14. r3 : c36e5400  r2 : 00000002  r1 : c0aa34e0  r0 : c0550a80
  15. Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
  16. Control: 0001317f  Table: c3b50000  DAC: 00000017
  17. Process swapper (pid: 0, stack limit = 0xc03ea268)​

    直接使用arm-linux-gdb vmlinux

    然后 使用命令跳转

  
  
  1. * iscsi_eh_cmd_timed_out+0x1c​

    就能定位到出错的行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值