当内核或驱动出现僵死bug,导致系统无法正常运行,怎么找到是哪个函数的位置导致的?

答,通过内核的系统时钟,因为它是由定时器中断产生的,每隔一定时间便会触发一次,所以当CPU一直在某个进程中时,我们便在中断函数中打印该进程的信息


1.先来回忆下

在之前的第5章内核中断运行过程:http://www.cnblogs.com/lifexy/p/7506504.html分析过,当内核中断产生时,会做以下几步:

  • 1)pc-4(计算返回地址值),然后将各个寄存器值存到sp栈里
  • 2)获取中断号,获取sp地址,然后调用asm_do_IRQ()

1.1其中asm_do_IRQ函数原型如下所示:

asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs);
//irq:中断号 *regs:发生中断前的各个寄存器基地址(=sp基地址)

1.2其中pt_regs结构体成员如下图所示,用来保存各个寄存器内容的数组:

2.所以本节目的,修改asm_do_IRQ()函数,添加如下内容:

  • 1)判断irq若等于系统时钟的irq,然后cnt++
  • 2)若在10s后,获取的进程没有改变,便打印:进程名字、PID、(regs-> ARM_pc)-4

(PS: 为什么要打印PC-4?    因为此时的PC是返回地址,而PC-4才是CPU运行的地址)

3.首先来找到系统时钟的中断号irq

输入#cat /proc/interrupt,如下图所示:

其中中断号来自 linux-2.6.22.6\include\asm-arm\arch-s3c2410\Irqs.h

而S3C2410 Timer Tick,就是我们的系统时钟计数值,在内核中就是jiffies这个全局变量,每隔一段时间+1。

所以S3C2410 Timer Tick的中断号为30

4.接下来便来修改asm_do_IRQ()函数

在asm_do_IRQ()中,添加以下带红色的字

asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)

{

struct pt_regs *old_regs = set_irq_regs(regs);

struct irq_desc *desc = irq_desc + irq;

#ifdef 1

static pid_t pre_pid;                    //进程号

static int cnt=0;                          //计数值

if(irq==30)          //判断irq中断号,是否等于系统时钟

{

if(pre_pid==current->pid)

{

cnt++;

}

else

{

cnt=0;

pre_pid=current->pid;

}

if(cnt==10*HZ)   //超时10s

{

cnt=0;

printk("s3c2410_timer_interrupt : pid = %d, task_name = %s\n",current->pid,current->comm);

printk("pc = %08x\n",regs->ARM_pc);

}

}

#endif

... ...

}

1)其中current是一个宏,为task_struct结构体,表示当前运行的进程信息,该宏通过get_current()来获取进程信息,位于include\asm-arm\current.h中

current->pid:当前进程的PID号

current->com:表示当前进程的name

2) HZ也是一个宏,代表每S的频率,比如每隔10ms加1,那么HZ就等于100

5.测试运行

接下来,我们便安装一个带有while(1)死循环的驱动,然后通过测试程序,内核便会一直在while(1)死循环,进入僵死状态。

由于修改了asm_do_IRQ()函数后,所以会打印下图信息:

5.1 然后便可以通过pc值=bf0000C,就能查找在哪个函数出错

(参考:http://www.cnblogs.com/lifexy/p/8006748.html)

38.Linux驱动调试-根据系统时钟定位出错位置的更多相关文章

  1. linux驱动调试--修改系统时钟终端来定位僵死问题【转】

    本文转载自:http://blog.chinaunix.net/uid-20671208-id-4940381.html 原文地址:linux驱动调试--修改系统时钟终端来定位僵死问题 作者:枫露清愁 ...

  2. Linux驱动设计—— 中断与时钟

    中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...

  3. linux驱动调试--段错误之oops信息分析

    linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id= ...

  4. linux驱动调试记录

    linux驱动调试 linux 目录 /proc 下面可以配置驱动的调试信息,比如给proc目录的自己定制的驱动的一文件设置一个变量,然后驱动程序跟了proc的参数值来配置调试级别.类似于内核调试的级 ...

  5. 36.Linux驱动调试-根据oops定位错误代码行

    1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来 1.1以LED驱动为例 将open()函数里的ioremap()屏蔽掉,直接使用物理地址的GPIOF,如下图所示: 1.2 ...

  6. Linux驱动设计—— 中断与时钟@request_irq参数详解

    request_irq函数定义 /*include <linux/interrupt.h>*/ int request_irq(unsigned int irq, irq_handler_ ...

  7. Linux驱动中获取系统时间

    最近在做VoIP方面的驱动,总共有16个FXS口和FXO口依次初始化,耗用的时间较多.准备将其改为多线程,首先需要确定哪个环节消耗的时间多,这就需要获取系统时间. #include <linux ...

  8. Linux驱动调试-根据oops的栈信息,确定函数调用过程

    上章链接入口: http://www.cnblogs.com/lifexy/p/8006748.html 在上章里,我们分析了oops的PC值在哪个函数出错的,那如何通过栈信息来查看出错函数的整个调用 ...

  9. 37.Linux驱动调试-根据oops的栈信息,确定函数调用过程

    上章链接入口: http://www.cnblogs.com/lifexy/p/8006748.html 在上章里,我们分析了oops的PC值在哪个函数出错的 本章便通过栈信息来分析函数调用过程 1. ...

随机推荐

  1. LeetCode 136. Single Number (落单的数)

    Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...

  2. ASP.NET Core 开源GitServer 实现自己的GitHub

    ASP.NET Core 2.0 开源Git HTTP Server,实现类似 GitHub.GitLab. GitHub:https://github.com/linezero/GitServer ...

  3. 【计算机网络】 一个小白的网络层学习笔记:总结下IP,NAT和DHCP

    前言:这篇文章是学习网络层协议时候总结的笔记,前面的主要部分介绍的都是IP协议, 后半部分介绍NAT协议和DHCP协议 参考书籍 <计算机网络-自顶向下>       作者 James F ...

  4. 关于C#开发中那些编码问题

    最近一直在搞各种编码问题,略有心得,与大家分享一番. System.Text提供了Encoding的抽象类,这个类提供字符串编码的方法.常用的编码方式主要有ASCII,Unicode,UTF8(Uni ...

  5. Another Eight Puzzle

    Problem Description Fill the following 8 circles with digits 1~8,with each number exactly once . Con ...

  6. 默认权限umask、文件系统权限、特殊权限

    第1章 权限相关错误 1.1 普通用户 ls /root/ /root  属于root 普通用户没有任何权限,所以无法查看 [oldboy@znix ~]$ ls /root/ ls: cannot ...

  7. IIC接口下的24C02 驱动分析

    本节来学习IIC接口下的24C02 驱动分析,本节学完后,再来学习Linux下如何使用IIC操作24C02 1.I2C通信介绍 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据,是一个多 ...

  8. 利用Python循环(包括while&for)各种打印九九乘法表

    一.for循环打印九九乘法表 #注意:由于缩进在浏览器不好控制,请大家见谅,后续会有图片传入. 1.1 左下角 for i in range(1,10): for j in range(1,i+1): ...

  9. 14.javaweb AJAX技术详解

    一.简介 1,  ajax:在不重新加载网页的前提下,与服务器交换数据并更新部分网页的技巧,但其本身并不是一种新技术 2,  核心:XMLHttpRequest对象.AJAX技术主要是通过此对象完成的 ...

  10. javascript第五章--函数表达式

    ① 递归 ② 闭包 ③ 模仿块级作用域 ④ 私有变量