通過OOPS信息中PC寄存器的值可以知道出錯指令的地址,通過棧回朔信息可以知道出錯時的函數調用的關系,根據這兩點可以很快定位錯誤。

修改drivers/net/ethernet/davicom/dm9000.c,在dm9000_probe函數中u32 id_val;下增加下面語句:

int *ptr =NULL;

*ptr=0xff;

編譯內核下載到開發板上,內核啟動會出現如類似下信息:

Unable to handle kernel NULL pointer dereference at virtual address 00000000

pgd = c0004000

[00000000] *pgd=00000000

Internal error: Oops: 805 [#1] PREEMPT SMP ARM

Modules linked in:

CPU: 1 PID: 1 Comm: swapper/0 Not tainted 3.14.0 #11

task: ee8a0000 ti: ee8a4000 task.ti: ee8a4000

PC is at dm9000_probe+0x1c/0x8f0

LR is at platform_drv_probe+0x18/0x48

pc : [] lr : [] psr: 60000153

sp : ee8a5e48 ip : 00000000 fp : 00000000

r10: c052a4fc r9 : 00000000 r8 : c0591e98

r7 : 00000000 r6 : ee97c810 r5 : ee97c800 r4 : 00000000

r3 : 000000ff r2 : 00000000 r1 : ee8a5de8 r0 : ee97c800

Flags: nZCv IRQs on FIQs off Mode SVC_32 ISA ARM Segment kernel

Control: 10c5387d Table: 4000404a DAC: 00000015

Process swapper/0 (pid: 1, stack limit = 0xee8a4240)

Stack: (0xee8a5e48 to 0xee8a6000)

5e40: ee975cf0 00000000 ee1503a8 00000001 c0561afc ee150438

5e60: 00000000 ee97c810 c0591e98 ee97c810 00000000 c0591e98 c0561afc c052a4fc

5e80: 00000000 c0247f7c c0247f64 c05d931c c0591e98 c0246668 ee97c810 c0591e98

5ea0: ee97c844 00000000 c054332c c0246804 c0591e98 c0246778 00000000 c0244fbc

5ec0: ee805478 ee9771c0 c0591e98 eeb73a00 c0590028 c0245e28 c04c3128 c0591e98

5ee0: 00000000 c0591e98 00000000 c054e2ac c059f280 c0246e1c 00000000 ee8a4000

5f00: 00000000 c00087b4 ee903b00 c05c3d50 60000153 c0571c00 60000100 c0571c00

5f20: 00000000 00000000 c0571bfc 00000000 c0505bc8 ef7fc918 00000089 c0034c6c

5f40: c04ca680 c0505338 00000006 00000006 00000000 c054e2c8 c054e2cc 00000006

5f60: c054e2ac c059f280 00000089 c052a4fc 00000000 c052ac4c 00000006 00000006

5f80: c052a4fc c003e0dc 00000000 c03b46ec 00000000 00000000 00000000 00000000

5fa0: 00000000 c03b46f4 00000000 c000e4b8 00000000 00000000 00000000 00000000

5fc0: 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000

5fe0: 00000000 00000000 00000000 00000000 00000013 00000000 ffffffff ffffffff

[] (dm9000_probe) from [] (platform_drv_probe+0x18/0x48)

[] (platform_drv_probe) from [] (driver_probe_device+0x100/0x210)

[] (driver_probe_device) from [] (__driver_attach+0x8c/0x90)

[] (__driver_attach) from [] (bus_for_each_dev+0x58/0x88)

[] (bus_for_each_dev) from [] (bus_add_driver+0xd8/0x1cc)

[] (bus_add_driver) from [] (driver_register+0x78/0xf4)

[] (driver_register) from [] (do_one_initcall+0x30/0x144)

[] (do_one_initcall) from [] (kernel_init_freeable+0xfc/0x1c8)

[] (kernel_init_freeable) from [] (kernel_init+0x8/0xe4)

錯誤分析:

1、第一行,說明是空指針造成的錯誤

Unable to handle kernel NULL pointer dereference at virtual address 00000000

2、寄存器信息主要是PC的值

PC is at dm9000_probe+0x1c/0x8f0

pc : []

方法一、錯誤定位

arm-none-linux-gnueabi-objdump -D vmlinux > vmlinux.dis

文件vmlinux.dis非常大打開需要一定時間

對於大多數情況,從反匯編代碼定位到C代碼並不會如此容易,需要有較強的閱讀匯編代碼的能力。

----------------------------------------------------------------------------------------------------------

方法二、錯誤定位

通過addr2line去定位

arm-none-linux-gnueabi-addr2line 0xc0277cc8-e vmlinux -f

linux 内核 addr2line,內核調試 arm-none-linux-gnueabi-addr2line 工具使用相关推荐

  1. linux 内核dmesg,linux內核調試kmsg,dmesg

    dmesg為我們多用,man dmesg告知dmesg用來顯示和管理kernel ring buffer,那麼後者為何物,以及dmesg顯示何類信息,是本文待闡述的內容. documentation/ ...

  2. 安裝linux後的內核調優

    vi /etc/sysctl.conf 编辑文件,加入以下内容: net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_ ...

  3. linux内核 sp什么意思,浅析基于ARM的Linux下的系统调用的实现

    12:  tbl    .req    r8        @ syscall table pointer 13:  why    .req    r8        @ Linux syscall ...

  4. linux 内核学习11-内核模块参数

    linux 内核学习11-内核模块参数 内核模块作为一个可拓展的动态模块,为Linux内核提供灵活性,所以需要依据不同的场景来传递不同的参数,实现不同的功能 1. 准备工作 #define modul ...

  5. 嵌入式Linux内核和文件系统,在IXP435上移植嵌入式Linux内核和根文件系统

    简要介绍如何在IXP435上移植嵌入式Linux内核和根文件系统 1.安装交叉编译工具 为什么要先安装交叉编译工具?由于我们的Linux操作系统是安装在嵌入式处理器平台上的,需要在主机上编译出开发板需 ...

  6. Linux内核网络数据包发送(四)——Linux netdevice 子系统

    Linux内核网络数据包发送(四)--Linux netdevice 子系统 1. 前言 2. `dev_queue_xmit` and `__dev_queue_xmit` 2.1 `netdev_ ...

  7. 优化Linux内核参数/etc/sysctl.conf sysctl 《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》...

    优化Linux内核参数/etc/sysctl.conf  sysctl  <高性能Linux服务器构建实战:运维监控.性能调优与集群应用> http://book.51cto.com/ar ...

  8. win10支持linux内核,Win10将允许您加载自定义Linux内核

    微软正在为Win10添加一个Linux内核,以支持Linux的Windows子系统.但是,猜测一下:你不必使用微软的Linux内核.您可以构建自己的自定义Linux内核供Windows使用. 此功能是 ...

  9. debian 编译linux内核源码,安装debian总结以及编译linux内核

    1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...

  10. Linux 内核调试 三:《QEMU ARM guest support》翻译

    原文路径:https://wiki.qemu.org/Documentation/Platforms/ARM QEMU通常对ARM客户端有很好的支持.它支持近五十种不同的机器.我们支持这么多的原因是A ...

最新文章

  1. C进阶 - 内存四驱模型
  2. 拿下斯坦福和剑桥双offer,00后的算法学习之路
  3. ARP欺骗防御工具arpon
  4. fullgc一小时发生一次的原因
  5. 4.0.13 mysql 注入_Windows2000下整合Mysql4.0.13与Tomcat4.1.24搭建Jsp环境
  6. Exchanger及其用法
  7. CF1110F Nearest Leaf
  8. Android图片缩放方法
  9. 戴尔服务器哪1顶型号好,戴尔PowerEdge R730xd新一代服务器评测
  10. Ubuntu安装JDK1.8
  11. 11G新特性 -- Expression Statistics
  12. Linux 计算器程序
  13. midi是计算机合成音乐文件,多媒体音频详解.ppt
  14. 手机网页如何添加在线客服代码?您的这样做
  15. Hopfield神经网络的联想记忆——数字识别的一些笔记
  16. Oracle ERP 模块
  17. 从大众、福特跟特斯拉的差距看智能电气架构落地的难点与破局点
  18. OPC 、OPC DA、OPC UA介绍
  19. EL表达式可以使用indexof方法吗
  20. 如何搭建自己的cdn

热门文章

  1. VSCode如何搭建Vue项目?详细步骤
  2. 不借助 vue-cli 工具自行搭建 vue 项目
  3. 51单片机 Proteus仿真 身高体重测量 HX711 超声波SR-04
  4. 天猫达尔文商品管理体系通俗简介
  5. (二十二)美萍酒店管理系统:系统维护_系统设置_房间设置_其他测试
  6. 多媒体计算机辅助英语教学,浅谈多媒体计算机辅助英语教学
  7. 西门子em235模块的功能_玩转西门子S7-200模拟量
  8. 计算机网络奇偶校验码题目,计算机网络试题(考试必备)分解.doc
  9. 单片机 最小系统原理图
  10. BCB中利用剪贴板复制粘贴