免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: platinum
打印 上一主题 下一主题

[已解决]有什么好的办法可以保存 kernel panic 信息? [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
61 [报告]
发表于 2010-06-01 14:55 |只看该作者
本帖正在讨论啊。LZ可以一贴一贴的看一下:wink:

论坛徽章:
0
62 [报告]
发表于 2010-06-01 15:27 |只看该作者
Godbach 兄,我试了,和直接在内核中保存文件是一样的错误

我的做法是
1、在 kernel 中自定义一个消息链,并 EXPORT 出去
2、写一个 module,负责注册这个 notifier_chain,并在 event 函数中 printk 并将 "KERNEL TEST!" 写到文件中
3、在 kernel 打印 OOPS 的代码中嵌入一个消息通知,通知 module 去执行 event 处理函数
4、载入 panic 模块来让内核崩溃

结果是
1、屏幕上有 panic 模块的 OOPS 信息
2、屏幕上有 "KERNEL TEST!" 字符串信息
3、屏幕上有很多和文件系统相关的 OOPS 信息(一屏幕装不下)
4、磁盘上没有生成我想要的文件

执行 event 时第一个报错的就是 flip_open 函数,和之前的测试是一样的
感觉这个原理是行不通的

论坛徽章:
0
63 [报告]
发表于 2010-06-01 15:54 |只看该作者
我觉得这个问题(PANIC时保存信息)的关键点是:对于系统自身挂起的时候,无法判断保存信息(例如写文件或网络发送等)所需的条件(例如磁盘、驱动等)是否可用。

也就是说,当系统自行挂起时,系统的本身状态就是未知的。

如果针对“已知”状态下(例如测试某部分代码的BUG)的PANIC,我觉得不如显式的做好异常处理。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
64 [报告]
发表于 2010-06-01 15:58 |只看该作者
3、在 kernel 打印 OOPS 的代码中嵌入一个消息通知,通知 module 去执行 event 处理函数

具体潜在traps.c的那个位置了,是不是内核也替换成新的了。

论坛徽章:
0
65 [报告]
发表于 2010-06-01 16:01 |只看该作者
本帖最后由 platinum 于 2010-06-01 16:04 编辑

  1. 448                 if (nl)
  2. 449                         printk("\n");
  3. 450                 if (notify_die(DIE_OOPS, str, regs, err,
  4. 451                                         current->thread.trap_no, SIGSEGV) !=
  5. 452                                 NOTIFY_STOP) {
  6. 453                         show_registers(regs);
  7. 454                         /* Executive summary in case the oops scrolled away */
  8. 455                         esp = (unsigned long) (&regs->esp);
  9. 456                         savesegment(ss, ss);
  10. 457                         if (user_mode(regs)) {
  11. 458                                 esp = regs->esp;
  12. 459                                 ss = regs->xss & 0xffff;
  13. 460                         }
  14. 461                         printk(KERN_EMERG "EIP: [<%08lx>] ", regs->eip);
  15. 462                         print_symbol("%s", regs->eip);
  16. 463 ++++++                  oops_notifier_call_chain(1, NULL);
  17. 464                         printk(" SS:ESP %04x:%08lx\n", ss, esp);
  18. 465                 }
  19. 466                 else
  20. 467                         regs = NULL;
复制代码
内核通知链参考文章:http://linux.chinaunix.net/bbs/viewthread.php?tid=1051266

内核是不是也替换成新的了?

如果内核不是新的,那么 module 是无法 register 自定义的 notifier_chain 的

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
66 [报告]
发表于 2010-06-01 16:10 |只看该作者
看不出是在哪个函数啊

论坛徽章:
0
67 [报告]
发表于 2010-06-01 16:12 |只看该作者
oops_notifier_call_chain(1, NULL);
这个是发送消息

在 module 里有针对 1 的 event 处理函数,里面做了 2 个事情:1、printk 一个信息;2、save to file

论坛徽章:
0
68 [报告]
发表于 2010-06-01 21:11 |只看该作者
方法一:

直接改panic那个函数在panic打印oops之前把那些东西直接写到文件系统里不就行了。


方法二:
与一类似,用kprobe在panic之前执行下类似panic的东西,把那些内容写到文件系统里。


当然,以上方法为文件系统重启后不会恢复到初始状态,以上方法未验证,有不对之处,请见谅

论坛徽章:
0
69 [报告]
发表于 2010-06-01 22:32 |只看该作者
方法一:

直接改panic那个函数在panic打印oops之前把那些东西直接写到文件系统里不就行了。


方法二 ...
unbutun 发表于 2010-06-01 21:11



看了大半天, 说白了就是写文件.

其实最大的问题是 当内核已经处于不可信状态如何写文件[?!/b]().

如果所有的硬件都支持nvram的话, 是可以注册一个console_driver, 把信息直接写到里面(可行性很高).
否则挺难的.
普通写文件的哪个抽象接口会引起进程调度, 内核panic后如果再发生调度可能导致OS无限循环panic.
而跳过写文件的抽象接口(f_ops->write, 应该是这个吧), 那就要为每个存储设备写特定的驱动代码来实现直接存储, 这个很难.

我也是做linux不久, 以前主要做vx(vxworks 的coredump功能相当好), 感叹还是商业提供的OS机制完善些.

评分

参与人数 1可用积分 +18 收起 理由
Godbach + 18 多谢分享

查看全部评分

论坛徽章:
0
70 [报告]
发表于 2010-06-01 22:52 |只看该作者
从头看到了尾,觉得还是63和69楼说到了点子上。

在KERNEL panic的时候,你不知道哪些功能是可以用的啊,继续写文件很容易搞成死循环。我觉得GOD老兄的思路估计不行。

其实就用ARTHUR_老兄说的KEXEC + KDUMP 的方式就可以了啊。虽然产生的文件很大,一般来说应该和物理内存大小一样,但是信息全啊。LZ如果不需要这么多信息,把其中自己想要的找出来就可以了?

PS:我现在做的一个工具似乎可以用在这方面,呵呵。不过需要硬件支持,而且只是一个PROTOTYPE. {:2_165:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP