根据epc定位linux内核报错.pdf

韩⼤卫@吉林师范⼤学

2014.12.10

转载请表明出处

*****************************************************

关于内核报错 “Unable to handle kernel paging request at virtual address” 的问题, 绝⼤多数都是

由于程序使⽤了不可⽤的指针⽽引起的, 定位这类问题的办法很简单,也希望我的描述⾜够简单实⽤.

以我下⾯的⼀个实例说明:

epc :exception program counter , 异常程序计数器, ra : return address 返回地址

我们可以根据 “CPU 0 Unable to handle kernel paging request at virtual address

0000000000000078, epc == ffffffff805e96e8, ra == ffffffff80ec73d0” 找到epc的具体位置, 再根据具

体的汇编程序定位出引起epc的具体原因, 另外, 如有必须知道全部的调⽤路径. 那么重复定位epc的

⽅法,根据call trace 逐步定位即可.

在编译linux 的时候, 会产⽣⼀个System.map , vmlinux, 以及vmlinux.o

我们使⽤System.map 和vmlinux.o 即可. 因为vmlinux可能是被特定压缩⼯具压缩过的(根据您的

makefile), ⽆法使⽤objdump⼯具做反汇编.

先打开System.map:

将 epc == ffffffff805e96e8 ⾥的 ffffffff805e96e8 地址拷⻉下来, 直接在System.map ⾥⾯查找, 如果没

有找到, 那么将ffffffff805e96e8 最后两位删掉, 即ffffffff805e96, 查找这个地址, 绝⼤多数情况都可以找

到, 我的如下:

看起来, 问题是出在 add_mtd_device 这个函数⾥⾯.

epc 的位置是在ffffffff805e96e8, add_mtd_device 的地址是在ffffffff805e96c0 , 那么应该是在

add_mtd_device⾥的ffffffff805e96e8 - ffffffff805e96c0 = 0x28 这个偏移位置出了问题.

现在我们需要观察 vmlinux.o 的汇编代码, 找到 add_mtd_device 函数的汇编, 观察 0x28 位置的汇编

语⾔.

先使⽤xxx-objdump(xxx 为具体的交叉编译⼯具前缀) 将vmlinux.o 反汇编出来, 我的做法是:

mips64-octeon-linux-gnu-objdump -dr vmlinux.o >> linux-dr

之后打开linux-dr 这个⽂件, 找到 add_mtd_device 的定义处:

可以看到, 0x28 位置的汇编:

28: dc820078 ld v0,120(a0)

ld v0, 120(a0) 的含义是:

先取寄存器a0的数值的地址, 再将该地址后120字节处的数值加载到v0 寄存器.

(a0)是取a0寄存器的地址, a0是负责传递函数的第⼀个参数的寄存器.

dc820078 就是ld v0, 120(a0) 对应的机器码.

根据CPU 0 Unable to handle kernel paging request at virtual address 0000000000000078 这句话

的提⽰可以知道, 是在对a0的0x78(120) 地址取值的时候发⽣了错误, 很可能是a0地址本⾝不可⽤.

如果能确认的话, 就可以证明add_mtd_device的第⼀个参数使⽤⼀个不可⽤的指针.

这时候就可以检查源代码, 相信您有能⼒很快到定位问题.

但如果该函数很⼤, 不容易定位, 那么我们可以通过120这个信息定位到该函数⾥具体的语句.

我的实例:

打开linux内核源代码, 计算120字节在add_mtd_device() 第⼀个参数类型⾥的位置, 得到参数成员:

vi -t add_mtd_device

如下图:

找到第⼀个参数的类型struct mtd_info 定义, 通过逐步计算每个成员偏移(注意填充字节), 可以算出

第120字节的成员为backing_dev_info. 那么, 在代码⾥, 出现epc的程序就是第⼀个出现该成员的地

⽅.

如果这个偏

linux 内核 报错,根据epc定位linux内核报错.pdf相关推荐

  1. android 地图定位报错,百度地图定位迷之报错(latitude : 4.9E-324 lontitude : 4.9E-324)

    估计很多小伙伴们在开发的时候会用到定位和地图功能,用的最多的应该是百度地图和高德地图,这两天我在使用百度地图定位的时候碰到了许多迷之bug,简直迷得不要不要的,把自己碰到的问题记下来,给自己一个记录, ...

  2. linux查看进程被kill原因,定位Linux下定位进程被谁KILL

    转载请注明出处 http://forever.blog.chinaunix.net 瀚海书香 今天上午有个同事问,自己的进程被莫名其妙的杀死了,想知道是被那个进程误杀了. 第一个想法是用kernel ...

  3. 编译linux源码报错,记录一次Linux内核源码编译实验

    记录一次Linux内核源码编译实验 文章目录 记录一次Linux内核源码编译实验 0. 实验环境 1. 选择.下载内核源码 2. 安装必要的依赖软件以及性能要求 3. 解压.配置和编译内核源码 3.1 ...

  4. 根据epc和ra定位linux kernel panic或者应用程序的出错位置

    根据epc和ra定位linux kernel panic或者应用程序的出错位置 一.背景 项目中出现了死机的问题,不幸的是没有保存下来coredump文件,只有简要的epc和ra信息.尝试复现问题,一 ...

  5. 错误linux autocof.h,【技巧】一种提高 [ 定位Linux内核编译错误 ] 效率的方法

    前言:在编译一些非标准linux内核时,常会出现一些错误导致编译中止.这其中的大部分都能通过根据编译器报出的错误定位来查阅源码.找到相关的依赖配置,然后修正配置状态来解决.但也有时候从依赖逻辑中无法发 ...

  6. linux 编译报错 not a directory,Linux常见英文报错中文翻译

    Linux常见英文报错中文翻译(菜鸟必知) 1.command not found 命令没有找到 2.No such file or directory 没有这个文件或目录 3.Permission ...

  7. linux系统读取excel文件是否存在,小弟我用poi读excel,在window下没有有关问题,但把程序放到linux上时,读取客户端的excel文件报错,不...

    我用poi读excel,在window下没有问题,但把程序放到linux上时,读取客户端的excel文件报错,不知道如何解决 我用poi读excel,在window下没有问题,但把程序放到linux上 ...

  8. Linux环境搭建 - update https://apt.repos.intel.com 报错

    Linux环境搭建 - update https://apt.repos.intel.com 报错 问题说明 解决方案 问题说明 执行 sudo apt-get update 之后, 出现 https ...

  9. linux mysql scripts_linux安装mysql时执行scripts/mysql_install_db报错如何解决?

    展开全部 linux安装mysql时执行scripts/mysql_install_db报错这样解决: 1.检查下当前目录是什636f707932313133353236313431303231363 ...

最新文章

  1. oracle SQL 命令行(二.视图(2))
  2. 赠人玫瑰,手有余香-期待协作更新机器学习的公益项目
  3. HDU1495 非常可乐
  4. AAAI 2021 | 基于动态混合关系网络的对话式语义解析方法
  5. 数据结构与算法问题 AVL二叉平衡树
  6. P4309-[TJOI2013]最长上升子序列【Splay】
  7. Ubuntu安装Google浏览器
  8. TIDB报错statement count 5001 exceeds the transaction limitation, autocommit = false问题解决
  9. [ZJOI2013]K大数查询
  10. L1-011. A-B-PAT团体程序设计天梯赛(GPLT)
  11. matlab数字图像处理大作业_线上教学优秀案例(16) | 数字图像处理基于蓝墨云+企业微信的线上教学经验分享...
  12. n的m划分 整数拆分问题
  13. 双机热备、双机互备与 双机双工的区别
  14. 第1章 数据库系统概论---数据库原理及应用
  15. 百度文库下载工具(所有源码)
  16. 陶哲轩实分析 4.1 节习题试解
  17. mysql打开数据库的sql语句_数据库MySQL——SQL语句(命令)
  18. UE4自定义资源和编辑器(一):创建自定义资源
  19. 4人抢答器----基于Step MAX10小脚丫开发板
  20. 蝙蝠侠最新截图----光影的典型例证

热门文章

  1. 《c语言从入门到精通》看书笔记——第4章 运算符与表达式
  2. java反射头文件_编程基础知识——C++能不能支持Java和ObjC的反射?
  3. Java猿面试_猿灯塔:关于Java面试,你应该准备这些知识点
  4. 微型计算机的主要硬件以及技术指标,微型计算机主要技术指标
  5. http协议与php关系,PHP中的HTTP协议
  6. php 序列化有上限,总结对比php中的多种序列化
  7. selenium切换窗口 java_WebDriver(Selenium2) 根据新窗口title切换窗口
  8. python项目实战干货_干货 | 这4个Python实战项目,让你瞬间读懂Python!
  9. upload_labs_pass17_二次渲染
  10. eclipse下拉框里的选项怎么鼠标单击表判断_领导让我预测下一年销量,怎么办?...