/******************

* 内核的调试技术

******************/

(1)内核源代码中的一些与调试相关的配置选项

内核的配置选项中包含了一些与内核调试相关的选项,都集中在"kernel hacking"菜单中。包括:

config_debug_kernel

使其他的调试选项可用,应该选中,其本身不会打开所有的调试功能。

具体的调试选项说明可参见驱动一书,或通过menuconfig的help说明查看。

(2)如何通过宏对printk调试语句进行全局控制

通过和makefile配合,可以在c文件中定义属于我们自己的调试语句。

(3)strace的使用

strace可以跟踪由用户空间程序所发出的所有系统调用。有用的参数有:

-t  显示调用发生的时间

-t  显式调用所花费的时间

-e  限定被跟踪的系统调用类型,如"-e execve"

-f  跟踪所有子进程

-p  跟踪特定进程。如"-p 8856"

-o  将输出的信息导入特定的文件

strace对于发现系统调用时的细微错误非常有用,尤其是针对多进程的程序,可以通过strace输出的返回值和进程pid获得大量有用信息。如:

$>strace -o zht.txt -f ./process_create

(4)ltrace的使用

ltrace可以跟踪由用户空间程序所发出的所有动态库函数调用。有用的参数有:

-t  显示调用发生的时间

-t  显式调用所花费的时间

-f  跟踪所有子进程

-p  跟踪特定进程

-o  将输出的信息导入特定的文件

(5)查看oops消息

oops是内核告知用户有不幸发生的最常用方式。通常,发送完oops后,内核会处于一种不稳定状态。

在某些情况下,oops会导致内核混乱,而混乱的结果就是死机,这些情况可能包括:

*oops发生在持有锁的代码中

*oops发生在和硬件设备通讯的过程中

*oops在中断上下文中发生

*oops发生在idle进程(0)或init进程(1),因为内核没有这两个进程没法工作

如果oops在其他进程运行时发生,内核会杀死该进程并尝试着继续运行。oops的产生有很多原因,包括内存访问越界或非法指令等。

oops包含的最重要讯息是寄存器上下文和回溯线索(call trace)可以人为引起oops,如:

if(bad_thing)

bug();

//或 bug_on(bad_thing);

可以用panic()引发更严重的错误,调用panic()不但会打印错误信息,还会挂起整个系统。只有在极端恶劣的情况下才会使用:

if(terrible_thing)

panic("foo is %ld!\n", foo);

有些时候,只要打印一下栈信息就可以帮助测试,如dump_stack():

if(!debug_check){

printk(kernel_debug "provide some info\n");

dump_stack();

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对萬仟网的支持。如果你想了解更多相关内容请查看下面相关链接

Linux内核驱动调试,Linux内核设备驱动之内核的调试技术笔记整理相关推荐

  1. linux内核led驱动开发,从Linux内核LED驱动来理解字符设备驱动开发流程

    目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设 ...

  2. Linux 设备驱动篇之I2c设备驱动

    ******************************************************************************************** 装载声明:希望 ...

  3. Linux I2C核心、总线与设备驱动

    Linux I2C核心.总线与设备驱动 I2C总线仅仅使用SCL. SDA这两根信号线就实现了设备之间的数据交互,极大地简化了对硬件资源和PCB板布线空间的占用.因此, I2C总线非常广泛地应用在EE ...

  4. Linux驱动开发:字符设备驱动开发实战

    Linux驱动开发:字符设备驱动开发实战 一.工程创建 VSCode 创建工程,设置 C/C++ 配置,导入 linux kernel 源码目录,方便 vscode 写代码自动补全,vscode 配置 ...

  5. 【linux驱动分析】misc设备驱动

        misc设备驱动.又称混杂设备驱动. misc设备驱动共享一个设备驱动号MISC_MAJOR.它在include\linux\major.h中定义:         #define MISC_ ...

  6. Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)

    一.前言 块设备主要为存储设备设计的框架. 在前面章节Linux下驱动开发_块设备驱动开发(内存模拟存储) 里介绍了块设备驱动编写思路,并且利用内存模拟了硬件存储,完成了块设备驱动开发测试.这一篇文章 ...

  7. 驱动中添加参数进行调试和控制设备驱动

    1.在加载驱动的时候向驱动传入参数: 1.1传入字符型参数 static char *name; module_param(name, charp, 0); MODULE_PARM_DESC(name ...

  8. linux内核源码分析之设备驱动

    目录 一.I/O 体系结构 二.与外设的交互 1.I/O端口: 2.I/O内存映射 3.轮询和中断 三.驱动分类 四.注册 五.与文件系统关联 六.资源管理 七.结构体总结 一.I/O 体系结构 与外 ...

  9. Linux内核移植 part2:uboot 设备驱动模型

    最近在移植uboot-2015.04的时候发现,uboot的设备驱动也带驱动模型了,第一次见到的时候还真是愣了一下,特别是调试的时候没有以前那么方便直接了.而且设备模型和设备树捆绑在一起,又得花费一番 ...

  10. usb linux 内核,Linux内核USB驱动架构:USB设备驱动架构.pdf

    USB 设备驱动架构 LK 版本:2.6.35.3 2013 年1 月14 日  任务目标: 分析整理插入一个USB 设备的处理过程.  USB 设备.配置.接口.设置以及端点的五者关系图: 一个 ...

最新文章

  1. [读书笔记]C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性
  2. pdo mysql bindparam_pdo连接mysql prepare,bindParam插入数据
  3. python详细安装教程3.7.4-python 3.7.4 安装 opencv的教程
  4. stm32 火灾自动报警及联动控制源码_中级消防设施操作员关键技能之十四:能测试火灾自动报警系统联动功能...
  5. 计算机专业单元测试卷答案,银保监会考试题库:计算机类模拟试题练习(六)答案...
  6. leetcode两数之和
  7. linux安装多路径报错,Linux操作系统配置多路径通用教程(适用于(RHEL,CentOS,SuSE等)...
  8. iptables 状态策略 允许内网连接外网 拒绝外网主动连入内网 _ 笔记
  9. 日语学习-多邻国-关卡1-家庭
  10. Win10安装配置CLion+MinGW
  11. 企业微信公众平台(4)KTV 3G网站建设
  12. 使用Mysql函数生成指定的自增序列号
  13. Axure RP使用技巧分享 快速提升效率
  14. 大江大河——通信设备商们的2019年
  15. 人群计数数据集汇总和详细介绍,全网最全,crowd counting datasets
  16. Cpulimit---控制cpu百分比
  17. 大数据基础课第三课 spark_core、Spark_sqlSpark_streaming
  18. WebView加载Html片段监听滑动到底部
  19. 题解 UVA12206 【Stammering Aliens】
  20. 一个jmeter自动化问题(对图片进行Base64、下载图片并保存到本地)

热门文章

  1. java for(o t :object) 获取顺序号_JAVA泛型通配符T,E,K,V区别 瞬间豁然开朗
  2. emacs .emacs_使用Emacs应该做的6件事
  3. perl 正则表达式 引擎_Perl 5引擎概述
  4. (9)vue.js 指令(1)
  5. ES6异步编程: co函数库的含义与用法
  6. 第二十三章:准备原材料
  7. JavaScript之call,bind,apply方法及 this 的用法辨析
  8. 大数据的相关性和因果性
  9. python图像分类代码_Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛
  10. python repair修复功能_详解Python修复遥感影像条带的两种方式