linux 内核 报错,根据epc定位linux内核报错.pdf
根据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相关推荐
- android 地图定位报错,百度地图定位迷之报错(latitude : 4.9E-324 lontitude : 4.9E-324)
估计很多小伙伴们在开发的时候会用到定位和地图功能,用的最多的应该是百度地图和高德地图,这两天我在使用百度地图定位的时候碰到了许多迷之bug,简直迷得不要不要的,把自己碰到的问题记下来,给自己一个记录, ...
- linux查看进程被kill原因,定位Linux下定位进程被谁KILL
转载请注明出处 http://forever.blog.chinaunix.net 瀚海书香 今天上午有个同事问,自己的进程被莫名其妙的杀死了,想知道是被那个进程误杀了. 第一个想法是用kernel ...
- 编译linux源码报错,记录一次Linux内核源码编译实验
记录一次Linux内核源码编译实验 文章目录 记录一次Linux内核源码编译实验 0. 实验环境 1. 选择.下载内核源码 2. 安装必要的依赖软件以及性能要求 3. 解压.配置和编译内核源码 3.1 ...
- 根据epc和ra定位linux kernel panic或者应用程序的出错位置
根据epc和ra定位linux kernel panic或者应用程序的出错位置 一.背景 项目中出现了死机的问题,不幸的是没有保存下来coredump文件,只有简要的epc和ra信息.尝试复现问题,一 ...
- 错误linux autocof.h,【技巧】一种提高 [ 定位Linux内核编译错误 ] 效率的方法
前言:在编译一些非标准linux内核时,常会出现一些错误导致编译中止.这其中的大部分都能通过根据编译器报出的错误定位来查阅源码.找到相关的依赖配置,然后修正配置状态来解决.但也有时候从依赖逻辑中无法发 ...
- linux 编译报错 not a directory,Linux常见英文报错中文翻译
Linux常见英文报错中文翻译(菜鸟必知) 1.command not found 命令没有找到 2.No such file or directory 没有这个文件或目录 3.Permission ...
- linux系统读取excel文件是否存在,小弟我用poi读excel,在window下没有有关问题,但把程序放到linux上时,读取客户端的excel文件报错,不...
我用poi读excel,在window下没有问题,但把程序放到linux上时,读取客户端的excel文件报错,不知道如何解决 我用poi读excel,在window下没有问题,但把程序放到linux上 ...
- Linux环境搭建 - update https://apt.repos.intel.com 报错
Linux环境搭建 - update https://apt.repos.intel.com 报错 问题说明 解决方案 问题说明 执行 sudo apt-get update 之后, 出现 https ...
- linux mysql scripts_linux安装mysql时执行scripts/mysql_install_db报错如何解决?
展开全部 linux安装mysql时执行scripts/mysql_install_db报错这样解决: 1.检查下当前目录是什636f707932313133353236313431303231363 ...
最新文章
- oracle SQL 命令行(二.视图(2))
- 赠人玫瑰,手有余香-期待协作更新机器学习的公益项目
- HDU1495 非常可乐
- AAAI 2021 | 基于动态混合关系网络的对话式语义解析方法
- 数据结构与算法问题 AVL二叉平衡树
- P4309-[TJOI2013]最长上升子序列【Splay】
- Ubuntu安装Google浏览器
- TIDB报错statement count 5001 exceeds the transaction limitation, autocommit = false问题解决
- [ZJOI2013]K大数查询
- L1-011. A-B-PAT团体程序设计天梯赛(GPLT)
- matlab数字图像处理大作业_线上教学优秀案例(16) | 数字图像处理基于蓝墨云+企业微信的线上教学经验分享...
- n的m划分 整数拆分问题
- 双机热备、双机互备与 双机双工的区别
- 第1章 数据库系统概论---数据库原理及应用
- 百度文库下载工具(所有源码)
- 陶哲轩实分析 4.1 节习题试解
- mysql打开数据库的sql语句_数据库MySQL——SQL语句(命令)
- UE4自定义资源和编辑器(一):创建自定义资源
- 4人抢答器----基于Step MAX10小脚丫开发板
- 蝙蝠侠最新截图----光影的典型例证
热门文章
- 《c语言从入门到精通》看书笔记——第4章 运算符与表达式
- java反射头文件_编程基础知识——C++能不能支持Java和ObjC的反射?
- Java猿面试_猿灯塔:关于Java面试,你应该准备这些知识点
- 微型计算机的主要硬件以及技术指标,微型计算机主要技术指标
- http协议与php关系,PHP中的HTTP协议
- php 序列化有上限,总结对比php中的多种序列化
- selenium切换窗口 java_WebDriver(Selenium2) 根据新窗口title切换窗口
- python项目实战干货_干货 | 这4个Python实战项目,让你瞬间读懂Python!
- upload_labs_pass17_二次渲染
- eclipse下拉框里的选项怎么鼠标单击表判断_领导让我预测下一年销量,怎么办?...