From 4b7bf7a46bb0ab32c2bb97ea6168c7e94c691f3a Mon Sep 17 00:00:00 2001 From: gatieme Date: Sun, 25 Jun 2017 13:14:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=9A=84oops...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/debug/modules/oops/apiopps | Bin 11265 -> 0 bytes .../modules/oops/disassemble_hello_init.png | Bin 35459 -> 0 bytes .../modules/panic/01-kernel_panic/README.md | 210 +++++++++++++ .../modules/panic/02-hard_panic/README.md | 169 ++++++++++ .../{oops => panic/03-soft_panic}/README.md | 297 ++---------------- .../03-soft_panic}/add_symbol_file.png | Bin .../03-soft_panic}/addr2line.sh | 0 .../03-soft_panic}/cat_hello_init_address.png | Bin .../panic/03-soft_panic/createoop/Makefile | 76 +++++ .../03-soft_panic/createoop/createoops.c | 23 ++ .../03-soft_panic/disassemble_hello_init.png | Bin 0 -> 38498 bytes .../03-soft_panic}/gdb_debug_oops.png | Bin .../03-soft_panic}/gdb_disassemble.png | Bin .../03-soft_panic}/insmod_oops.png | Bin .../03-soft_panic/kerneloops}/Makefile | 0 .../03-soft_panic/kerneloops}/apiopps.c | 0 .../03-soft_panic/kerneloops}/kerneloops.c | 0 .../03-soft_panic/list_address_offset.png | Bin 0 -> 37206 bytes .../03-soft_panic}/objdump_disassemble.png | Bin study/driver/00-code/rmmod/force_rmmod.c | 10 +- 20 files changed, 515 insertions(+), 270 deletions(-) delete mode 100755 study/debug/modules/oops/apiopps delete mode 100644 study/debug/modules/oops/disassemble_hello_init.png create mode 100644 study/debug/modules/panic/01-kernel_panic/README.md create mode 100644 study/debug/modules/panic/02-hard_panic/README.md rename study/debug/modules/{oops => panic/03-soft_panic}/README.md (54%) rename study/debug/modules/{oops => panic/03-soft_panic}/add_symbol_file.png (100%) rename study/debug/modules/{oops => panic/03-soft_panic}/addr2line.sh (100%) rename study/debug/modules/{oops => panic/03-soft_panic}/cat_hello_init_address.png (100%) create mode 100644 study/debug/modules/panic/03-soft_panic/createoop/Makefile create mode 100644 study/debug/modules/panic/03-soft_panic/createoop/createoops.c create mode 100644 study/debug/modules/panic/03-soft_panic/disassemble_hello_init.png rename study/debug/modules/{oops => panic/03-soft_panic}/gdb_debug_oops.png (100%) rename study/debug/modules/{oops => panic/03-soft_panic}/gdb_disassemble.png (100%) rename study/debug/modules/{oops => panic/03-soft_panic}/insmod_oops.png (100%) rename study/debug/modules/{oops => panic/03-soft_panic/kerneloops}/Makefile (100%) rename study/debug/modules/{oops => panic/03-soft_panic/kerneloops}/apiopps.c (100%) rename study/debug/modules/{oops => panic/03-soft_panic/kerneloops}/kerneloops.c (100%) create mode 100644 study/debug/modules/panic/03-soft_panic/list_address_offset.png rename study/debug/modules/{oops => panic/03-soft_panic}/objdump_disassemble.png (100%) diff --git a/study/debug/modules/oops/apiopps b/study/debug/modules/oops/apiopps deleted file mode 100755 index 2e717b693411ee276fd8212cfcc526da503e8ceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11265 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 pP_hvS?0j1AeNGX?TID@KQHr +知识共享许可协议 +本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处 +
+ +#1 Kernel PANIC/OOPS +------- + + +>wiki:A kernel panic is an action taken by an operating system upon detecting an internal fatal error from which it cannot safely recover. The term is largely specific to Unix and Unix-like systems; for Microsoft Windowsoperating systems the equivalent term is “Bug check” (or, colloquially, “Blue Screen of Death“). +The kernel routines that handle panics (in AT&T-derived and BSD Unix source code, a routine known as panic()) are generally designed to output an error message to the console, dump an image of kernel memory to disk for post-mortemdebugging and then either wait for the system to be manually rebooted, or initiate an automatic reboot. The information provided is of highly technical nature and aims to assist a system administrator or software developer in diagnosing the problem. +Attempts by the operating system to read an invalid or non-permitted memory address are a common source of kernel panics. A panic may also occur as a result of a hardware failure or a bug in the operating system. In many cases, the operating system could continue operation after memory violations have occurred. However, the system is in an unstable state and rather than risking security breaches and data corruption, the operating system stops to prevent further damage and facilitate diagnosis of the error. + The kernel panic was introduced in an early version of Unix and demonstrated a major difference between the design philosophies of Unix and its predecessor Multics. Multics developer Tom van Vleck recalls a discussion of this change with Unix developer Dennis Ritchie: +I remarked to Dennis that easily half the code I was writing in Multics was error recovery code. He said, “We left all that stuff out. If there’s an error, we have this routine called panic, and when it is called, the machine crashes, and you holler down the hall, ‘Hey, reboot it.’”[1] +The original panic() function was essentially unchanged from Fifth Edition UNIX to the VAX-based UNIX 32V and output only an error message with no other information, then dropped the system into an endless idle loop. As the Unixcodebase was enhanced, the panic() function was also enhanced to dump various forms of debugging information to the console. + +##1.1 什么是 `Kernel PANIC` +------- + +`panic` 是英文中是**惊慌**的意思, `Linux Kernel panic` 正如其名, `Linux Kernel` 不知道如何走了, 它会尽可能把它此时能获取的全部信息都打印出来, 为开发人员调试提供帮助. + +有两种主要类型 `Kernel panic` + +* Hard Panic(也就是Aieee信息输出) + +* Soft Panic(也就是Oops信息输出) + +##1.2 什么会导致Linux Kernel Panic +------- + +只有加载到内核空间的驱动模块才能直接导致 `kernel panic`, 你可以在系统正常的情况下, 使用 `lsmod` 查看当前系统加载了哪些模块. 除此之外, 内建在内核里的组件(比如 `memory map`等)也能导致panic. + +常见Linux Kernel Panic报错内容 + +```CPP +Kernel panic-not syncing fatal exception in interrupt +kernel panic – not syncing: Attempted to kill the idle task! +kernel panic – not syncing: killing interrupt handler! +Kernel Panic – not syncing:Attempted to kill init ! +``` + + + + + +一般出现下面的情况,就认为是发生了 `kernel panic` : + +* 机器彻底被锁定,不能使用 + +* 数字键(Num Lock),大写锁定键(Caps Lock),滚动锁定键(Scroll Lock)不停闪烁。 + +* 如果在终端下,应该可以看到内核dump出来的信息(包括一段"Aieee"信息或者"Oops"信息) + +* 和Windows蓝屏相似 + + + + +>因为 `hard panic` 和 `soft panic` 本质上不同,因此我们分别讨论. + +#2 hard panic +------- + +对于 `hard panic` 而言, 最大的可能性是驱动模块的中断处理(`interrupt handler`)导致的, 一般是因为驱动模块在中断处理程序中访问一个空指针(`null pointer`). + +一旦发生这种情况,驱动模块就无法处理新的中断请求,最终导致系统崩溃. + +##2.1 原因 +------- + +对于 `hard panic` 而言,最大的可能性是驱动模块的中断处理(`interrupt handler`)导致的,一般是因为驱动模块在中断处理程序中访问一个空指针(`null pointre`). + +一旦发生这种情况, 驱动模块就无法处理新的中断请求, 最终导致系统崩溃. + +##2.2 信息收集 +------- + +根据 `panic` 的状态不同, 内核将记录所有在系统锁定之前的信息. 因为 `kenrel panic` 是一种很严重的错误, 不能确定系统能记录多少信息, 下面是一些需要收集的关键信息, 他们非常重要,因此尽可能收集全,当然如果系统启动的时候就kernel panic,那就无法只知道能收集到多少有用的信息了。 + + +1. `/var/log/messages`, 幸运的时候, 整个 `kernel panic` 栈跟踪信息都能记录在这里. 要确认是否有一个足够的栈跟踪信息,你只要查找包含"EIP"的一行, 它显示了是什么函数和模块调用时导致`panic`. + +2. 应用程序/库 日志: 可能可以从这些日志信息里能看到发生 `panic` 之前发生了什么。 + +3. 其他发生 `panic` 之前的信息, 或者知道如何重现panic那一刻的状态 + +4. 终端屏幕 `dump`信息, 一般 `OS`被锁定后, 复制, 粘贴肯定是没戏了, 因此这类信息, 你可以需要借助数码相机或者原始的纸笔工具了. + +如果 `kernel dump` 信息既没有在 `/var/log/message` 里, 也没有在屏幕上, 那么尝试下面的方法来获取(当然是在还没有死机的情况下). + +1. 如果在图形界面,切换到终端界面,dump信息是不会出现在图形界面的,甚至都不会在图形模式下的虚拟终端里. + +2. 确保屏幕不黑屏,可以使用下面的几个方法: + + ```cpp + setterm -blank 0 + setterm -powerdown 0 + setvesablank off + ``` +3. 从终端,拷贝屏幕信息 + +##2.3 排查方法 +------- +栈跟踪信息(`stack trace`)是排查 `kernel panic` 最重要的信息, 该信息如果在/var/log/messages日志里当然最好,因为可以看到全部的信息,如果仅仅只是在屏幕上,那么最上面的信息可能因为滚屏消失了,只剩下栈跟踪信息的一部分。如果你有一个完整栈跟踪信息的话,那么就可能根据这些充分的信息来定位panic的根本原因。要确认是否有一个足够的栈跟踪信息,你只要查找包含”EIP”的一行,它显示了是什么函数和模块调用时导致panic + + +使用内核调试工具(`kenrel debugger ,aka KDB`) +如果跟踪信息只有一部分且不足以用来定位问题的根本原因时, `kernel debugger(KDB)`就需要请出来了。 + +KDB编译到内核里,panic发生时,他将内核引导到一个shell环境而不是锁定。这样,我们就可以收集一些与panic相关的信息了,这对我们定位问题的根本原因有很大的帮助。 + + + + +#3 soft panic +------- + +1. 症状没有 `hard panic`严重 + +2. 通常导致段错误(`segmentation fault`) + +3. 以看到一个 `oops` 信息, `/var/log/message`s里可以搜索到'Oops'. + +4. 机器稍微还能用(但是收集信息后,应该会重启系统). + +##3.1 原因 +------- + +凡是非中断处理引发的模块崩溃都将导致 `soft panic` + +在这种情况下, 驱动本身会崩溃, 但是还不至于让系统出现致命性失败, 因为它没有锁定中断处理例程. 导致 `hard panic`的原因同样对`soft panic`也有用(比如在运行时访问一个空指针). + +##3.2 信息收集 +------- + +当 `soft panic`发生时, 内核将产生一个包含内核符号(`kernel symbols`)信息的 `dump`数据, 这个将记录在`/var/log/messages`里. + +##3.3 排查方法 +------- + +为了开始排查故障, 可以使用 `ksymoops` 工具来把内核符号信息转成有意义的数据. + +为了生成ksymoops文件,需要 + +* 从 `/var/log/messages` 里找到的堆栈跟踪文本信息保存为一个新文件。确保删除了时间戳(`timestamp`),否则 `ksymoops` 会失败. + +* 运行 `ksymoops` 程序(如果没有,请安装) +详细的`ksymoops`执行用法,可以参考`ksymoops(8)`手册。 + +`Oops` 可以看成是内核级的 `Segmentation Fault`. + +* 应用程序如果进行了非法内存访问或执行了非法指令, 会得到 `Segfault` 信号, 一般的行为是 `coredump`, 应用程序也可以自己截获`Segfault` 信号,自行处理 + +* 如果内核自己犯了这样的错误, 则会打出 `Oops` 信息. + +处理器使用的所有地址几乎都是通过一个复杂的页表结构对物理地址映射而得到的虚拟地址(除了内存管理子系统自己所使用的物理地址)。当一个非法的指针被废弃时,内存分页机制将不能为指针映射一个物理地址,处理器就会向操作系统发出一个页故障信号。如果地址不合法,那么内核将不能在该地址“布页”;这时如果处理器处于超级用户模式,内核就会生成一条oops消息。 + + +#4 参考资料 +------- + +[根据内核Oops 定位代码工具使用— addr2line 、gdb、objdump](http://blog.csdn.net/u012719256/article/details/53365155) + +[转载_Linux内核OOPS调试](http://blog.csdn.net/tommy_wxie/article/details/12521535) + + +[kernel panic/kernel oops分析](http://blog.chinaunix.net/uid-20651662-id-1906954.html) + + +[DebuggingKernelOops](https://wiki.ubuntu.com/DebuggingKernelOops) + + +[kerneloops package in Ubuntu](https://launchpad.net/ubuntu/+source/kerneloops) + + +[Understanding a Kernel Oops!](http://opensourceforu.com/2011/01/understanding-a-kernel-oops/) + + +[Kernel oops错误](http://blog.163.com/prodigal_s/blog/static/204537164201411611432884/) + + +[Kernel Oops Howto](http://madwifi-project.org/wiki/DevDocs/KernelOops) + + +[Kernel Panics](https://wiki.archlinux.org/index.php/Kernel_Panics) + +[WiKipedia](https://en.wikipedia.org/wiki/Linux_kernel_oops) + +[Oops中的error code解释](http://blog.csdn.net/mozun1/article/details/53306714) + +知识共享许可协议 +
+本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可 diff --git a/study/debug/modules/panic/02-hard_panic/README.md b/study/debug/modules/panic/02-hard_panic/README.md new file mode 100644 index 0000000..913f29f --- /dev/null +++ b/study/debug/modules/panic/02-hard_panic/README.md @@ -0,0 +1,169 @@ +Linux Kernel PANIC(二)--Hard Panic/Aieee实例分析 +======= + +本文信息 + +| CSDN | GitHub | +|:----:|:------:| +| [Linux Kernel PANIC(二)--Hard Panic/Aieee实例分析](http://blog.csdn.net/gatieme/article/details/73712595) | [`LDD-LinuxDeviceDrivers/study/debug/modules/panic/02-hard_panic`](https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/debug/modules/panic/02-hard_panic) | + + +同类博文信息 + +| CSDN | GitHub | +|:----:|:------:| +| [Linux Kernel PANIC(一)--概述(Hard Panic/Aieee和Soft Panic/Oops)](http://blog.csdn.net/gatieme/article/details/73711897) | [`LDD-LinuxDeviceDrivers/study/debug/modules/panic/01-kernel_panic`](https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/debug/modules/panic/01-kernel_panic) | +| [Linux Kernel PANIC(二)--Hard Panic/Aieee实例分析](http://blog.csdn.net/gatieme/article/details/73712595) | [`LDD-LinuxDeviceDrivers/study/debug/modules/panic/02-hard_panic`](https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/debug/modules/panic/02-hard_panic) | + +
+知识共享许可协议 +本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处 +
+ + +对于 `hard panic` 而言, 最大的可能性是驱动模块的中断处理(`interrupt handler`)导致的, 一般是因为驱动模块在中断处理程序中访问一个空指针(`null pointer`). + +一旦发生这种情况,驱动模块就无法处理新的中断请求,最终导致系统崩溃. + +关于 Hard Panic 的详细信息, 请参见[Kernel PANIC概述(Hard Panic/Aieee和Soft Panic/Oops)]() + + + +#1 实例1--Kernel panic-not syncing fatal exception +------- + +##1.1 问题描述 +------- + +今天就遇到一个客户机器内核报错 : "Kernel panic-not syncing fatal exception" + +重启后正常, 几个小时后出现同样报错,系统down了,有时重启后可恢复有时重启后仍然报同样的错误。 + +我先来解释一下什么是fatal exception? +“致命异常(fatal exception)表示一种例外情况,这种情况要求导致其发生的程序关闭。通常,异常(exception)可能是任何意想不到的情况(它不仅仅包括程序错误)。致命异常简单地说就是异常不能被妥善处理以至于程序不能继续运行。 +软件应用程序通过几个不同的代码层与操作系统及其他应用程序相联系。当异常(exception)在某个代码层发生时,为了查找所有异常处理的代码,各个代码层都会将这个异常发送给下一层,这样就能够处理这种异常。如果在所有层都没有这种异常处理的代码,致命异常(fatal exception)错误信息就会由操作系统显示出来。这个信息可能还包含一些关于该致命异常错误发生位置的秘密信息(比如在程序存储范围中的十六进制的位置)。这些额外的信息对用户而言没有什么价值,但是可以帮助技术支持人员或开发人员调试程序。 +当致命异常(fatal exception)发生时,操作系统没有其他的求助方式只能关闭应用程序,并且在有些情况下是关闭操作系统本身。当使用一种特殊的应用程序时,如果反复出现致命异常错误的话,应将这个问题报告给软件供应商。 ” +而且此时键盘无任何反应,必然使用reset键硬重启。 +panic.c源文件有个方法,当panic挂起后,指定超时时间,可以重新启动机器 + +##1.2 解决方法 +------- + + +>`vi /etc/sysctl.conf` 添加 + +```cpp +kernel.panic = 20 #panic error中自动重启,等待timeout为20秒 +kernel.sysrq=1 #激活Magic SysRq 否则,键盘鼠标没有响应 +``` + +按住 `[ALT]+[SysRq]+[COMMAND]`, 这里 SysRq` 是 `Print SCR` 键, 而 `COMMAND` 按以下来解释! + +| 命令 | 描述 | +|:---:|:---:| +| b |立即重启 +| e | 发送SIGTERM给init之外的系统进程 | +| o | 关机 | +| s | sync同步所有的文件系统 | +| u | 试图重新挂载文件系统 | + +#2 示例2--Kernel panic-not syncing fatal exception in interrupt +------- + +##2.1 问题描述 +------- + +很多网友安装 `Linux` 出现 `Kernel panic-not syncing fatal exception in interrupt` 是由于网卡驱动原因。 + +##2.2 解决方法 +------- + + +将 `BIOS`选项 `"Onboard Lan"` 的选项 `"Disabled"`, 重启从光驱启动即可. + +等安装完系统之后, 再进入 `BIOS` 将 "Onboard Lan" 的选项给 `"enable"`, 下载相应的网卡驱动安装。 + +如出现以下报错 : + +```CPP +init() r8168 … + … … + … :Kernel panic: Fatal exception +``` + +`r8168` 是网卡型号. + +在 `BIOS` 中禁用网卡, 从光驱启动安装系统. 再从网上下载网卡驱动安装. + +```cpp +#tar vjxf r8168-8.014.00.tar.bz2 +# make clean modules (as root or with sudo) + # make install + # depmod -a + # modprobe r8168 +``` + +安装好系统后 `reboot` 进入 `BIOS` 把网卡打开. + +另有网友在 `Kernel panic` 出错信息中看到 `"alc880"`, 这是个声卡类型. 尝试着将声卡关闭, 重启系统, 搞定. + + +#3 示例3--Kernel panic-not syncing fatal exception +------- + +##3.1 问题描述 +------- + + +安装 `linux` 系统遇到安装完成之后, 无法启动系统出现 `Kernel panic-not syncing fatal exception`. + +##3.2 解决方法 +------- + + +很多情况是由于板载声卡、网卡、或是cpu 超线程功能 (`Hyper-Threading`) 引起的. + + +这类问题的解决办法就是先查看错误代码中的信息, 找到错误所指向的硬件, 将其禁用. 系统启动后, 安装好相应的驱动, 再启用该硬件即可. + +>另外出现 `"Kernel Panic — not syncing: attempted to kill init"` 和 `"Kernel Panic — not syncing: attempted to kill idle task"` +> +>有时把内存互相换下位置或重新插拔下可以解决问题。 + + + +#4 参考资料 +------- + +[根据内核Oops 定位代码工具使用— addr2line 、gdb、objdump](http://blog.csdn.net/u012719256/article/details/53365155) + +[转载_Linux内核OOPS调试](http://blog.csdn.net/tommy_wxie/article/details/12521535) + + +[kernel panic/kernel oops分析](http://blog.chinaunix.net/uid-20651662-id-1906954.html) + + +[DebuggingKernelOops](https://wiki.ubuntu.com/DebuggingKernelOops) + + +[kerneloops package in Ubuntu](https://launchpad.net/ubuntu/+source/kerneloops) + + +[Understanding a Kernel Oops!](http://opensourceforu.com/2011/01/understanding-a-kernel-oops/) + + +[Kernel oops错误](http://blog.163.com/prodigal_s/blog/static/204537164201411611432884/) + + +[Kernel Oops Howto](http://madwifi-project.org/wiki/DevDocs/KernelOops) + + +[Kernel Panics](https://wiki.archlinux.org/index.php/Kernel_Panics) + +[WiKipedia](https://en.wikipedia.org/wiki/Linux_kernel_oops) + +[Oops中的error code解释](http://blog.csdn.net/mozun1/article/details/53306714) + +知识共享许可协议 +
+本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可 diff --git a/study/debug/modules/oops/README.md b/study/debug/modules/panic/03-soft_panic/README.md similarity index 54% rename from study/debug/modules/oops/README.md rename to study/debug/modules/panic/03-soft_panic/README.md index 8014bf5..29c41f7 100644 --- a/study/debug/modules/oops/README.md +++ b/study/debug/modules/panic/03-soft_panic/README.md @@ -1,276 +1,42 @@ -Linux内核oops调试 +Linux Kernel PANIC(三)--Soft Panic/Oops调试及实例分析 ======= + +本文信息 + | CSDN | GitHub | |:----:|:------:| -| [Aderstep--紫夜阑珊-青伶巷草](http://blog.csdn.net/gatieme) | [`AderXCoding/system/tools`](https://github.com/gatieme/AderXCoding/tree/master/system/tools) | +| [Linux Kernel PANIC(三)--Soft Panic/Oops调试及实例分析](http://blog.csdn.net/gatieme/article/details/73715860) | [`LDD-LinuxDeviceDrivers/study/debug/modules/panic/03-soft_panic`](https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/debug/modules/panic/03-soft_panic) | +同类博文信息 + +| CSDN | GitHub | +|:----:|:------:| +| [Linux Kernel PANIC(一)--概述(Hard Panic/Aieee和Soft Panic/Oops)](http://blog.csdn.net/gatieme/article/details/73711897) | [`LDD-LinuxDeviceDrivers/study/debug/modules/panic/01-kernel_panic`](https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/debug/modules/panic/01-kernel_panic) | +| [Linux Kernel PANIC(二)--Hard Panic/Aieee实例分析](http://blog.csdn.net/gatieme/article/details/73712595) | [`LDD-LinuxDeviceDrivers/study/debug/modules/panic/02-hard_panic`](https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/debug/modules/panic/02-hard_panic) | +| [Linux Kernel PANIC(三)--Soft Panic/Oops调试及实例分析](http://blog.csdn.net/gatieme/article/details/73715860) | [`LDD-LinuxDeviceDrivers/study/debug/modules/panic/03-soft_panic`](https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/debug/modules/panic/03-soft_panic) | +
知识共享许可协议 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处
-#1 Kernel PANIC/OOPS -------- - - ->wiki:A kernel panic is an action taken by an operating system upon detecting an internal fatal error from which it cannot safely recover. The term is largely specific to Unix and Unix-like systems; for Microsoft Windowsoperating systems the equivalent term is “Bug check” (or, colloquially, “Blue Screen of Death“). -The kernel routines that handle panics (in AT&T-derived and BSD Unix source code, a routine known as panic()) are generally designed to output an error message to the console, dump an image of kernel memory to disk for post-mortemdebugging and then either wait for the system to be manually rebooted, or initiate an automatic reboot. The information provided is of highly technical nature and aims to assist a system administrator or software developer in diagnosing the problem. -Attempts by the operating system to read an invalid or non-permitted memory address are a common source of kernel panics. A panic may also occur as a result of a hardware failure or a bug in the operating system. In many cases, the operating system could continue operation after memory violations have occurred. However, the system is in an unstable state and rather than risking security breaches and data corruption, the operating system stops to prevent further damage and facilitate diagnosis of the error. - The kernel panic was introduced in an early version of Unix and demonstrated a major difference between the design philosophies of Unix and its predecessor Multics. Multics developer Tom van Vleck recalls a discussion of this change with Unix developer Dennis Ritchie: -I remarked to Dennis that easily half the code I was writing in Multics was error recovery code. He said, “We left all that stuff out. If there’s an error, we have this routine called panic, and when it is called, the machine crashes, and you holler down the hall, ‘Hey, reboot it.’”[1] -The original panic() function was essentially unchanged from Fifth Edition UNIX to the VAX-based UNIX 32V and output only an error message with no other information, then dropped the system into an endless idle loop. As the Unixcodebase was enhanced, the panic() function was also enhanced to dump various forms of debugging information to the console. - -##1.1 什么是 `Kernel PANIC` -------- - -`panic` 是英文中是**惊慌**的意思, `Linux Kernel panic` 正如其名, `Linux Kernel` 不知道如何走了, 它会尽可能把它此时能获取的全部信息都打印出来, 为开发人员调试提供帮助. - -有两种主要类型 `Kernel panic` - -* Hard Panic(也就是Aieee信息输出) - -* Soft Panic(也就是Oops信息输出) - -##1.2 什么会导致Linux Kernel Panic -------- - -只有加载到内核空间的驱动模块才能直接导致 `kernel panic`, 你可以在系统正常的情况下, 使用 `lsmod` 查看当前系统加载了哪些模块. 除此之外, 内建在内核里的组件(比如 `memory map`等)也能导致panic. - -常见Linux Kernel Panic报错内容 - -```CPP -Kernel panic-not syncing fatal exception in interrupt -kernel panic – not syncing: Attempted to kill the idle task! -kernel panic – not syncing: killing interrupt handler! -Kernel Panic – not syncing:Attempted to kill init ! -``` - - - - - -一般出现下面的情况,就认为是发生了 `kernel panic` : - -* 机器彻底被锁定,不能使用 - -* 数字键(Num Lock),大写锁定键(Caps Lock),滚动锁定键(Scroll Lock)不停闪烁。 - -* 如果在终端下,应该可以看到内核dump出来的信息(包括一段"Aieee"信息或者"Oops"信息) - -* 和Windows蓝屏相似 - - - - ->因为 `hard panic` 和 `soft panic` 本质上不同,因此我们分别讨论. - -#2 hard panic -------- - -对于 `hard panic` 而言, 最大的可能性是驱动模块的中断处理(`interrupt handler`)导致的, 一般是因为驱动模块在中断处理程序中访问一个空指针(`null pointer`). - -一旦发生这种情况,驱动模块就无法处理新的中断请求,最终导致系统崩溃. - -##2.1 原因 -------- - -对于 `hard panic` 而言,最大的可能性是驱动模块的中断处理(`interrupt handler`)导致的,一般是因为驱动模块在中断处理程序中访问一个空指针(`null pointre`). - -一旦发生这种情况, 驱动模块就无法处理新的中断请求, 最终导致系统崩溃. - -##2.2 信息收集 -------- - -根据 `panic` 的状态不同, 内核将记录所有在系统锁定之前的信息. 因为 `kenrel panic` 是一种很严重的错误, 不能确定系统能记录多少信息, 下面是一些需要收集的关键信息, 他们非常重要,因此尽可能收集全,当然如果系统启动的时候就kernel panic,那就无法只知道能收集到多少有用的信息了。 - - -1. `/var/log/messages`, 幸运的时候, 整个 `kernel panic` 栈跟踪信息都能记录在这里. 要确认是否有一个足够的栈跟踪信息,你只要查找包含"EIP"的一行, 它显示了是什么函数和模块调用时导致`panic`. - -2. 应用程序/库 日志: 可能可以从这些日志信息里能看到发生 `panic` 之前发生了什么。 - -3. 其他发生 `panic` 之前的信息, 或者知道如何重现panic那一刻的状态 - -4. 终端屏幕 `dump`信息, 一般 `OS`被锁定后, 复制, 粘贴肯定是没戏了, 因此这类信息, 你可以需要借助数码相机或者原始的纸笔工具了. - -如果 `kernel dump` 信息既没有在 `/var/log/message` 里, 也没有在屏幕上, 那么尝试下面的方法来获取(当然是在还没有死机的情况下). - -1. 如果在图形界面,切换到终端界面,dump信息是不会出现在图形界面的,甚至都不会在图形模式下的虚拟终端里. - -2. 确保屏幕不黑屏,可以使用下面的几个方法: - - ```cpp - setterm -blank 0 - setterm -powerdown 0 - setvesablank off - ``` -3. 从终端,拷贝屏幕信息 - -##2.3 排查方法 -------- -栈跟踪信息(`stack trace`)是排查 `kernel panic` 最重要的信息, 该信息如果在/var/log/messages日志里当然最好,因为可以看到全部的信息,如果仅仅只是在屏幕上,那么最上面的信息可能因为滚屏消失了,只剩下栈跟踪信息的一部分。如果你有一个完整栈跟踪信息的话,那么就可能根据这些充分的信息来定位panic的根本原因。要确认是否有一个足够的栈跟踪信息,你只要查找包含”EIP”的一行,它显示了是什么函数和模块调用时导致panic - - -使用内核调试工具(`kenrel debugger ,aka KDB`) -如果跟踪信息只有一部分且不足以用来定位问题的根本原因时, `kernel debugger(KDB)`就需要请出来了。 - -KDB编译到内核里,panic发生时,他将内核引导到一个shell环境而不是锁定。这样,我们就可以收集一些与panic相关的信息了,这对我们定位问题的根本原因有很大的帮助。 - -#3 PANIC实例分析 -------- - -##3.1 实例1--Kernel panic-not syncing fatal exception -------- - -###3.1.1 问题描述 -------- - -今天就遇到一个客户机器内核报错 : "Kernel panic-not syncing fatal exception" - -重启后正常, 几个小时后出现同样报错,系统down了,有时重启后可恢复有时重启后仍然报同样的错误。 - -我先来解释一下什么是fatal exception? -“致命异常(fatal exception)表示一种例外情况,这种情况要求导致其发生的程序关闭。通常,异常(exception)可能是任何意想不到的情况(它不仅仅包括程序错误)。致命异常简单地说就是异常不能被妥善处理以至于程序不能继续运行。 -软件应用程序通过几个不同的代码层与操作系统及其他应用程序相联系。当异常(exception)在某个代码层发生时,为了查找所有异常处理的代码,各个代码层都会将这个异常发送给下一层,这样就能够处理这种异常。如果在所有层都没有这种异常处理的代码,致命异常(fatal exception)错误信息就会由操作系统显示出来。这个信息可能还包含一些关于该致命异常错误发生位置的秘密信息(比如在程序存储范围中的十六进制的位置)。这些额外的信息对用户而言没有什么价值,但是可以帮助技术支持人员或开发人员调试程序。 -当致命异常(fatal exception)发生时,操作系统没有其他的求助方式只能关闭应用程序,并且在有些情况下是关闭操作系统本身。当使用一种特殊的应用程序时,如果反复出现致命异常错误的话,应将这个问题报告给软件供应商。 ” -而且此时键盘无任何反应,必然使用reset键硬重启。 -panic.c源文件有个方法,当panic挂起后,指定超时时间,可以重新启动机器 - -###3.1.2 解决方法 -------- - - ->`vi /etc/sysctl.conf` 添加 - -```cpp -kernel.panic = 20 #panic error中自动重启,等待timeout为20秒 -kernel.sysrq=1 #激活Magic SysRq 否则,键盘鼠标没有响应 -``` - -按住 `[ALT]+[SysRq]+[COMMAND]`, 这里 SysRq` 是 `Print SCR` 键, 而 `COMMAND` 按以下来解释! - -| 命令 | 描述 | -|:---:|:---:| -| b |立即重启 -| e | 发送SIGTERM给init之外的系统进程 | -| o | 关机 | -| s | sync同步所有的文件系统 | -| u | 试图重新挂载文件系统 | - -##3.2 示例2--Kernel panic-not syncing fatal exception in interrupt -------- - -###3.2.1 问题描述 -------- - -很多网友安装 `Linux` 出现 `Kernel panic-not syncing fatal exception in interrupt` 是由于网卡驱动原因。 - -###3.2.2 解决方法 -------- - - -将 `BIOS`选项 `"Onboard Lan"` 的选项 `"Disabled"`, 重启从光驱启动即可. - -等安装完系统之后, 再进入 `BIOS` 将 "Onboard Lan" 的选项给 `"enable"`, 下载相应的网卡驱动安装。 - -如出现以下报错 : - -```CPP -init() r8168 … - … … - … :Kernel panic: Fatal exception -``` - -`r8168` 是网卡型号. - -在 `BIOS` 中禁用网卡, 从光驱启动安装系统. 再从网上下载网卡驱动安装. - -```cpp -#tar vjxf r8168-8.014.00.tar.bz2 -# make clean modules (as root or with sudo) - # make install - # depmod -a - # modprobe r8168 -``` - -安装好系统后 `reboot` 进入 `BIOS` 把网卡打开. - -另有网友在 `Kernel panic` 出错信息中看到 `"alc880"`, 这是个声卡类型. 尝试着将声卡关闭, 重启系统, 搞定. - - -##3.3 示例3--Kernel panic-not syncing fatal exception -------- - -###3.3.1 问题描述 -------- - - -安装 `linux` 系统遇到安装完成之后, 无法启动系统出现 `Kernel panic-not syncing fatal exception`. - -###3.3.2 解决方法 -------- - - -很多情况是由于板载声卡、网卡、或是cpu 超线程功能 (`Hyper-Threading`) 引起的. - - -这类问题的解决办法就是先查看错误代码中的信息, 找到错误所指向的硬件, 将其禁用. 系统启动后, 安装好相应的驱动, 再启用该硬件即可. - ->另外出现 `"Kernel Panic — not syncing: attempted to kill init"` 和 `"Kernel Panic — not syncing: attempted to kill idle task"` -> ->有时把内存互相换下位置或重新插拔下可以解决问题。 - - - -#4 soft panic -------- - -1. 症状没有 `hard panic`严重 - -2. 通常导致段错误(`segmentation fault`) - -3. 以看到一个 `oops` 信息, `/var/log/message`s里可以搜索到'Oops'. - -4. 机器稍微还能用(但是收集信息后,应该会重启系统). - -##4.1 原因 -------- 凡是非中断处理引发的模块崩溃都将导致 `soft panic` 在这种情况下, 驱动本身会崩溃, 但是还不至于让系统出现致命性失败, 因为它没有锁定中断处理例程. 导致 `hard panic`的原因同样对`soft panic`也有用(比如在运行时访问一个空指针). -##4.2 信息收集 +其他参照 +[]() + +[]() + + +#1 驱动OOPS实例分析 ------- -当 `soft panic`发生时, 内核将产生一个包含内核符号(`kernel symbols`)信息的 `dump`数据, 这个将记录在`/var/log/messages`里. - -##4.3 排查方法 -------- - -为了开始排查故障, 可以使用 `ksymoops` 工具来把内核符号信息转成有意义的数据. - -为了生成ksymoops文件,需要 - -* 从 `/var/log/messages` 里找到的堆栈跟踪文本信息保存为一个新文件。确保删除了时间戳(`timestamp`),否则 `ksymoops` 会失败. - -* 运行 `ksymoops` 程序(如果没有,请安装) -详细的`ksymoops`执行用法,可以参考`ksymoops(8)`手册。 - -`Oops` 可以看成是内核级的 `Segmentation Fault`. - -* 应用程序如果进行了非法内存访问或执行了非法指令, 会得到 `Segfault` 信号, 一般的行为是 `coredump`, 应用程序也可以自己截获`Segfault` 信号,自行处理 - -* 如果内核自己犯了这样的错误, 则会打出 `Oops` 信息. - -处理器使用的所有地址几乎都是通过一个复杂的页表结构对物理地址映射而得到的虚拟地址(除了内存管理子系统自己所使用的物理地址)。当一个非法的指针被废弃时,内存分页机制将不能为指针映射一个物理地址,处理器就会向操作系统发出一个页故障信号。如果地址不合法,那么内核将不能在该地址“布页”;这时如果处理器处于超级用户模式,内核就会生成一条oops消息。 - - -#5 驱动OOPS实例分析 -------- - -##5.1 导致 `OOPS` 的代码 +##1.1 导致 `OOPS` 的代码 ------- @@ -373,7 +139,7 @@ endif ``` -##5.2 重现 `OOPS` +##1.2 重现 `OOPS` ------- make后加载模块, 提示加载失败, 此时内核倒是了OOPS, 由于故障不严重, 系统并未死机 @@ -381,7 +147,7 @@ make后加载模块, 提示加载失败, 此时内核倒是了OOPS, 由于故障 ![加载模块导致OOPS](insmod_oops.png) -##5.3 `OOPS` 信息 +##1.3 `OOPS` 信息 ------- 查看 `Kernel` 的日志, 或者 `dmesg` 打印日志可以查看 `OOPS` 信息 @@ -433,7 +199,7 @@ make后加载模块, 提示加载失败, 此时内核倒是了OOPS, 由于故障 -##5.4 OOOPS信息分析 +##1.4 OOOPS信息分析 ------- ```cpp @@ -539,7 +305,7 @@ cpp[ 5235.516883] Code: 04 25 00 00 00 00 01 00 00 00 48 89 e5 5d c3 00 00 -##5.5 发现问题所在 +##1.5 发现问题所在 ------- @@ -575,7 +341,7 @@ cpp[ 5235.516883] Code: 04 25 00 00 00 00 01 00 00 00 48 89 e5 5d c3 00 00 -###5.5.1 通过gdb调试列出地址所对应的位置 +###1.5.1 通过gdb调试列出地址所对应的位置 ------- 由于我们的是驱动出现的问题, 那么我们就用gdb直接调试驱动的 `KO` 文件, 如果是源内核出现的 `OOPS`, 那么只能用 `gdb` 对 `vmlinux` 文件进行调试 @@ -605,7 +371,7 @@ b *(hello_init+0x3) 此方法对于内核OOPS同样适用, 调试时将驱动 `KO` 文件替换为内核 `vmlinux` 文件 -###5.5.2 addr2line将地址转换为对应的源代码 +###1.5.2 addr2line将地址转换为对应的源代码 ------- ```cpp @@ -613,7 +379,7 @@ addr2line -e kerneloops.o hello_init+0x3 ``` 此方法对于内核OOPS同样适用, 调试时将驱动 `KO` 文件或者 `OBJ` 文件替换为内核 `vmlinux` 文件 -###5.5.3 将gdb反汇编代码得到地址直接转换为对应的源代码 +###1.5.3 将gdb反汇编代码得到地址直接转换为对应的源代码 ------- 对于驱动来说, 可以从`/sys/module/对应驱动名称/sections/.init.text` 查找到对应的地址信息 @@ -647,7 +413,8 @@ l *(address+offset) cat /sys/module/kerneloops/sections/.init.text OR nm kerneloops.ko | grep hello_init -OR kerneloops.o | grep hello_init +OR +nm kerneloops.o | grep hello_init ``` ![获取地址](cat_hello_init_address.png) @@ -691,7 +458,7 @@ l *(0x0000000000000027) 此方法对于内核OOPS同样适用, 调试时将驱动 `KO` 文件或者 `OBJ` 文件替换为内核 `vmlinux` 文件, 通过 `nm vmlinux`和 `cat /proc/kallsyms` 获取到对应的地址信息 -###5.5.4 使用objdump反汇编代码得到地址 +###1.5.4 使用objdump反汇编代码得到地址 ------- ```cpp @@ -723,7 +490,7 @@ objdump -S kerneloops.o 此方法对于内核OOPS同样适用, 调试时将驱动 `KO` 文件或者 `OBJ` 文件替换为内核 `vmlinux` 文件 -#4 参考资料 +#2 参考资料 ------- [根据内核Oops 定位代码工具使用— addr2line 、gdb、objdump](http://blog.csdn.net/u012719256/article/details/53365155) diff --git a/study/debug/modules/oops/add_symbol_file.png b/study/debug/modules/panic/03-soft_panic/add_symbol_file.png similarity index 100% rename from study/debug/modules/oops/add_symbol_file.png rename to study/debug/modules/panic/03-soft_panic/add_symbol_file.png diff --git a/study/debug/modules/oops/addr2line.sh b/study/debug/modules/panic/03-soft_panic/addr2line.sh similarity index 100% rename from study/debug/modules/oops/addr2line.sh rename to study/debug/modules/panic/03-soft_panic/addr2line.sh diff --git a/study/debug/modules/oops/cat_hello_init_address.png b/study/debug/modules/panic/03-soft_panic/cat_hello_init_address.png similarity index 100% rename from study/debug/modules/oops/cat_hello_init_address.png rename to study/debug/modules/panic/03-soft_panic/cat_hello_init_address.png diff --git a/study/debug/modules/panic/03-soft_panic/createoop/Makefile b/study/debug/modules/panic/03-soft_panic/createoop/Makefile new file mode 100644 index 0000000..f8eb8c6 --- /dev/null +++ b/study/debug/modules/panic/03-soft_panic/createoop/Makefile @@ -0,0 +1,76 @@ +# ------------------------------------------------------------------------------ +# +# Makefile for the LDD-LinuxDeviceDrivers. +# +# Author: gatieme +# Create: 2016-07-29 15:50:46 +# Last modified: 2016-07-29 16:10:29 +# Description: +# This program is loaded as a kernel(v2.6.18 or later) module. +# Use "make install" to load it into kernel. +# Use "make remove" to remove the module out of kernel. +# +# ------------------------------------------------------------------------------ + + +# my driver description +DRIVER_VERSION := "1.0.0" +DRIVER_AUTHOR := "Gatieme @ AderStep Inc..." +DRIVER_DESC := "Linux input module for Elo MultiTouch(MT) devices" +DRIVER_LICENSE := "Dual BSD/GPL" + + +MODULE_NAME := createoops +EXTRA_CFLAGS += -g + + + + + + +ifneq ($(KERNELRELEASE),) + + + + +obj-m := $(MODULE_NAME).o #print_vmarea.o + +else + +KERNELDIR ?= /lib/modules/$(shell uname -r)/build + +PWD := $(shell pwd) + +modules: + make -C $(KERNELDIR) M=$(PWD) modules + +modules_install: + make -C $(KERNELDIR) M=$(PWD) modules_install + + + +insmod: + sudo insmod $(MODULE_NAME).ko + +reinsmod: + sudo rmmod $(MODULE_NAME) + sudo insmod $(MODULE_NAME).ko + +github: + cd $(ROOT) && make github + +rmmod: + sudo rmmod $(MODULE_NAME) + + +clean: + make -C $(KERNELDIR) M=$(PWD) clean + rm -f modules.order Module.symvers Module.markers + +.PHNOY: + modules modules_install clean + + + +endif + diff --git a/study/debug/modules/panic/03-soft_panic/createoop/createoops.c b/study/debug/modules/panic/03-soft_panic/createoop/createoops.c new file mode 100644 index 0000000..757e29e --- /dev/null +++ b/study/debug/modules/panic/03-soft_panic/createoop/createoops.c @@ -0,0 +1,23 @@ +#include +#include +#include + +static void create_oops(void) +{ + *(int *)0 = 0; +} + +static int __init my_oops_init(void) +{ + printk("oops from the module\n"); + create_oops(); + return (0); +} + +static void __exit my_oops_exit(void) +{ + printk("Goodbye world\n"); +} + +module_init(my_oops_init); +module_exit(my_oops_exit); diff --git a/study/debug/modules/panic/03-soft_panic/disassemble_hello_init.png b/study/debug/modules/panic/03-soft_panic/disassemble_hello_init.png new file mode 100644 index 0000000000000000000000000000000000000000..c885f229344b2897e10d7515f4df8b095b9d3c3f GIT binary patch literal 38498 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 return 0; } - /* 打印内核模块的地址 */ if((symbol_addr = kallsyms_lookup_name(modname)) == NULL) { printk("[%s] %s symbol_addr : (null)\n", THIS_MODULE->name, modname); - return 0; + //return 0; + } + else + { + printk("[%s] %s symbol_addr : 0x%x\n", THIS_MODULE->name, modname, symbol_addr); } - printk("[%s] %s symbol_addr : 0x%x\n", THIS_MODULE->name, modname, symbol_addr); - - return force_cleanup_module(modname); }