一、内核调试方法简单分析

1、addr2line: 解决oops错误

  a -- oops消息

oops(也称 panic),称程序运行崩溃,程序崩溃后会产生oops消息。应用程序或内核线程的崩溃都会产生oops消息,通常发生oops时,系统不会发生死机,而在终端或日志中打印oops信息。

当使用NULL指针或不正确的指针值时,通常会引发一个 oops 消息,这是因为当引用一个非法指针时,页面映射机制无法将虚拟地址映像到物理地址,处理器就会向操作系统发出一个"页面失效"的信号。内核无法"换页"到并不存在的地址上,系统就会产生一个"oops"。
     oops 显示发生错误时处理器的状态,包括 CPU 寄存器的内容、页描述符表的位置,以及其一些难理解的信息。这些消息由失效处理函数(arch/*/kernel/traps.c)中的printk 语句产生。较为重要的信息就是指令指针(EIP),即出错指令的地址。

    

     b -- 解决方法

          arm-linux-addr2line  地址  -e  vmlinux  -f

将Pc地址转换成对应的行号

2、通过printk打印信息

内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字符串前加一个带尖括号的整数来控制的,如 printk("<6>Hello, world!/n");。内核中共提供了八种不同的日志级别,在 linux/kernel.h 中有相应的宏对应。

#define KERN_EMERG    "<0>"    /* system is unusable */
#define KERN_ALERT    "<1>"    /* action must be taken immediately */
#define KERN_CRIT     "<2>"    /* critical conditions */
#define KERN_ERR      "<3>"    /* error conditions */
#define KERN_WARNING  "<4>"    /* warning conditions */
#define KERN_NOTICE   "<5>"    /* normal but significant */
#define KERN_INFO     "<6>"    /* informational */
#define KERN_DEBUG    "<7>"    /* debug-level messages */

所以 printk() 可以这样用:

      printk(KERN_INFO "Hello, world!/n");。

未指定日志级别的 printk() 采用的默认级别是 DEFAULT_MESSAGE_LOGLEVEL,这个宏在 kernel/printk.c 中被定义为整数 4,即对应KERN_WARNING

在 /proc/sys/kernel/printk 会显示4个数值(可由 echo 修改), 分别表示当前控制台日志级别、未明确指定日志级别的默认消息日志级别、最小(最高)允许设置的控制台日志级别、引导时默认的日志级别。

当 printk() 中的消息日志级别小于当前控制台日志级别时,printk 的信息(要有/n符)就会在控制台上显示。但无论当前控制台日志级别是何值,通过 /proc/kmsg (或使用dmesg)总能查看。另外如果配置好并运行了 syslogd 或 klogd,没有在控制台上显示的 printk 的信息也会追加到 /var/log/messages.log 中。

char myname[] = "chinacodec/n";
printk(KERN_INFO "Hello, world %s!/n", myname);

Exynos4412 内核移植(七)—— 内核相关知识补充相关推荐

  1. linux的内核和发行版本号,【编测编学】linux内核及发行版本相关知识

    之前很多孩子就和我说老师我会linux,我就会反问,你学软件测试,你会linux你知道linux的东西如何和企业结合吗? 不是你只会一些cd.chmod.chown.ps.find.tar.vim.v ...

  2. Python第二章相关知识补充

    经过这周的Python课堂,第二章的知识点可以说是被彻头彻尾地讲了一下,所以我在此将上一篇发布的博客内容也加以完善. 2.1.3 列表元素的删除 在学习了列表元素的增加以后,删除列表元素的方法也可以进 ...

  3. 【电路】【扩展】锂电池相关知识补充

    锂电池相关知识 因为看到别人做平衡车直接使用18650电池供电,整整齐齐地码了3颗在PCB上感觉十分优雅,所以自己也想要用18650做一个,奈何对这方面一无所知,索性把相关知识都学一遍吧. 因为网上资 ...

  4. 【必须】螺钉螺母相关知识补充

    本文主要介绍在电赛中制作机械结构时需要的螺丝.螺母.轴承等相关知识. 参考资料: 1.百度百科 2.不同的螺丝头型都有那些不同的用途?不同的螺丝头型都有那些不同的用途? 1.螺丝 在制作作品的时候,最 ...

  5. Exynos4412 Uboot 移植(六)—— 相关知识补充

    Uboot版本:u-boot-2013.01 一.gd结构体的定义与使用 gd_t 和 bd_t 是u-boot中两个重要的数据结构,在初始化操作很多都要靠这两个数据结构来保存或传递. gd_t 定义 ...

  6. 安全证书相关知识补充

    [参考资料] [1]https://www.cnblogs.com/junjiany/p/6273560.html [2]https://blog.csdn.net/joah_li/article/d ...

  7. 嵌入式linux内核移植

    获取linux内核 移植linux内核首先我们需要先获内核源码,可以从linux官网下载:https://www.kernel.org,但是一般做法是 根据cpu类型从它们的半导体厂商网站获取,因为半 ...

  8. Next.js踩坑入门系列(七) —— 其他相关知识

    Next.js踩坑入门系列 (一) Hello Next.js (二) 添加Antd && CSS (三) 目录重构&&再谈路由 (四) Next.js中期填坑 (五) ...

  9. (三)内核移植--从零开始自制linux掌上电脑(F1C200S)<嵌入式项目>

    目录 一.bootloader.kernel.rootfs联系 二.内核移植 1. 内核源码获取 2. 内核配置与编译

最新文章

  1. P2000-拯救世界【生成函数,NTT】
  2. 图解,C语言希尔排序
  3. python与人工智能应用锁_linux应用锁的搜索结果-阿里云开发者社区
  4. C# 基础知识复习(四)---数组
  5. 扎根CNCF社区贡献五年是怎样的体验?听听华为云原生开源团队的负责人怎么说
  6. 《Head First设计模式》 读书笔记03 装饰对象
  7. Sqoop导入到hdfs
  8. 职工工资管理系统c语言,C++实现企业职工工资管理系统
  9. Learn OpenGL 笔记6.2 Gamma Correction(伽马校正)
  10. 百度这个写在控制台的消息:2021百度校招
  11. MAC电脑制作iPhone手机铃声
  12. 微信小程序常见问题记录
  13. cors nginx 怎么解决_NGINX配置跨域CORS支持的正确方式
  14. Floodlight模块分析:forwarding模块
  15. hdu 4544 优先队列
  16. android wifi布局,Android使用 WiFi 建立 P2P 连接
  17. 任志强:松房贷等政策出台后 房价走低趋势将逆转
  18. vb6.0 Access数据库
  19. 小程序毕业设计 基于微信旅游攻略小程序毕业设计开题报告功能参考
  20. 【转360】KB4041678 Windows 仅安全更新(2017.10) 补丁更新后执行SQL出错! http://bbs.360.cn/thread-15201531-1-1.html...

热门文章

  1. UML该元素的行为为基础的元素
  2. yarn oom问题一例
  3. 劳心者、劳力者或CEO、CTO各得其所,足矣
  4. 脚本 api_从脚本到预测API
  5. java http2_探索HTTP/2: HTTP 2协议简述(原)
  6. vue图片压缩不失真_图片压缩会失真?快试试这几个无损压缩神器。
  7. 季节性时间序列数据分析_如何指导时间序列数据的探索性数据分析
  8. 深入理解HTTP协议
  9. leetcode 278. 第一个错误的版本(二分)
  10. 如何在Go中编写防弹代码:不会失败的服务器工作流程