Linux内核设备驱动之内核的调试技术笔记整理

 更新时间:2018年12月17日 11:35:03   作者:Engineer-Bruce_Yang  
今天小编就为大家分享一篇关于Linux内核设备驱动之内核的调试技术笔记整理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
/******************
 * 内核的调试技术
 ******************/

(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中$符号的基础用法总结

    这篇文章主要给大家介绍了关于linux中$符号的基础用法,文中通过示例代码介绍的非常详细,对大家学习或者使用linux系统具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • ubuntu下chorme提示输入秘钥环的解决方法

    ubuntu下chorme提示输入秘钥环的解决方法

    这篇文章主要给大家介绍了ubuntu下chorme提示输入秘钥环的解决方法,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • linux 编译安装python3.6的教程详解

    linux 编译安装python3.6的教程详解

    这篇文章主要介绍了linux 编译安装python3.6的教程,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • Ubuntu下安装rsh实现无密码访问详解

    Ubuntu下安装rsh实现无密码访问详解

    这篇文章主要为大家详细介绍了Ubuntu下安装rsh实现无密码访问的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Linux之CentOS7下如何关闭SELINUX

    Linux之CentOS7下如何关闭SELINUX

    这篇文章主要介绍了Linux之CentOS7下如何关闭SELINUX问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • ubuntu16.04在python3 下创建Django项目并运行的操作方法

    ubuntu16.04在python3 下创建Django项目并运行的操作方法

    这篇文章主要介绍了ubuntu16.04在python3 下创建Django项目并运行,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • linux(centos7)搭建SVN服务器的思路

    linux(centos7)搭建SVN服务器的思路

    这篇文章主要为大家详细介绍了linux搭建SVN服务器的思路,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Linux中的tcpdump命令示例详解

    Linux中的tcpdump命令示例详解

    这篇文章主要给大家介绍了关于Linux中tcpdump命令的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Linux 用cp和rsync同步文件时跳过指定目录的方法

    Linux 用cp和rsync同步文件时跳过指定目录的方法

    某测试站点,在某个节点的时候需要同步到正式站点去,但是里面的config目录不能覆盖
    2012-11-11
  • CentOS服务器+监控宝SNMP监控全攻略分享

    CentOS服务器+监控宝SNMP监控全攻略分享

    很多人和Sudu一样都想使用监控宝去监控自己的linux服务器,但是因为安装snmp存在一些问题导致无法成功设置snmp的设置。
    2010-12-12

最新评论