zoukankan      html  css  js  c++  java
  • 学习研究内核oops

    学习研究内核oops调试。
    oops 其实就是个拟声词语,表示惊讶!即‘哎呦?真没想到,对不起,抱歉!’在操作系统上的表示为蓝屏(windows系统)或者kernel panic/kernel crash(非winwos系统)。
    我今天在centos6.5和7.2下尝试模拟了kernel panic。首先我新建了一个指针乱指的c文件,接着建立了Makefile文件,再接着生成.ko模块文件,紧接着我使用了insmod 临时插入模块到内核中,执行完该动作之后操作系统马上瘫痪并打印出一堆信息:
     
     
    而且现在使用终端没法连接操作系统,因为系统已经死机了,唯有重启系统让内核自动重新载入了,于是重启之后系统恢复正常了。但是问题原因在哪儿呢?
    大致可以看出stack部分是打印出的堆栈信息,Call Trace部分是打印出的函数调用情况,Code 部分是错误具体位置,进一步查看Code信息发现了有一行... RIP [<ffffffffa009e01e>] oops_example_init+0x1e/0x1000 [oops]
    其中的oops_example_init就是源代码里头的函数名,接下来分析该函数发现了一个错误:
    static int __init oops_example_init(void)
    {
            int *p=0;
            LKP("enter");
            *p=0x1234;
            return 0;
    }
    我将4660,即0x1234赋值给0这个地址,这显然是个致命的错误。kernel panic产生的其中原因之一就是指针造成的错误,这里正好印证了。
     
    总结:我这里用的是虚拟机,而且造成错误的代码是自己编写的,知道错误在哪,如果生产环境的话那就没有这么简单了,起码生产环境必须开启kdump转储内核panic后的信息至core文件才行。否则不利于故障调试分析。
  • 相关阅读:
    从零开始学ios开发(十三):Table Views(下)Grouped and Indexed Sections
    求助三陀工作室
    2015.6-2017.6软件测试学习计划
    标签管理
    Git的分支管理(三)
    Git的分支管理(二)
    Git的分支管理(一)
    Git的远程仓库
    Git版本的管理
    Git的版本管理创建和修改
  • 原文地址:https://www.cnblogs.com/sonwnja/p/6802865.html
Copyright © 2011-2022 走看看