定位内核问题难点

  1. 死机没有现场或信息不全,有信息无法进一步分析;
  2. 调试困难,gdb只能作为辅助;
  3. 内核庞杂,系统代码量大,无从下手;
  4. 问题的表现和问题的原因不一定直接关联。linux内核堆栈大多是我们开发的模块问题。

Linux内核问题分类

  1. 按问题源头分:原生内核&开发模块
  2. 按严重层度分:致命问题&严重问题
  3. 按分析难易分:有现场&没有现场
  4. 内核问题常见表现:
    kernel panic
    死锁(忙等和挂死)
    内存泄漏
    Warning

准备工作

  1. 工欲善其事必先利其器
  2. 必胜的信心

Linux内核分析工具箱

调试工具:gdb、ftrace、systemtap
反汇编:objdump
现场分析:kdump & crash
预警工具:各种debug
核心要素:代码是所有问题分析的最核心要素,没有之一。

现场分析

现场分析

准备工作(内核源码)



堆栈信息分析(x86架构)

堆栈深入分析(x86架构)

  1. 函数反汇编,找到对应行。(GDB或objdump输出饭汇编)
  2. 分析错误行,结合反汇编分析出错的C语言代码。(GDB)
  3. 结合反汇编和栈信息,分析出错的内存数据,找到对应的数据。(GDB和kdump信息)
  4. 根据流程分析出现错误的原因。

详情见博客:kdump定位

案例分析–(数据类型1)


经典案例——磁盘容量获取错误

案例分析–(踩内存)

调试工具:堆栈分析,打印。
该问题定位过程是在没有使用高级工具的情况下完成的,能解决主要是依靠对流程的分析。
该问题的提示编程规范还是要遵守的。代码简单是可维护性的重要保证。

案例分析–(死锁)

Aug 31 18:40:06 localhost kernel: =============================================
Aug 31 18:40:06 localhost kernel: [ INFO: possible recursive locking detected ]
Aug 31 18:40:06 localhost kernel: 2.6.32-131.21.1.b2.00 #4
Aug 31 18:40:06 localhost kernel: ---------------------------------------------
Aug 31 18:40:06 localhost kernel: insmod/32470 is trying to acquire lock:
Aug 31 18:40:06 localhost kernel: (&t_lock.tlock){+.+...}, at: [<ffffffffa02f70a4>] test_func_level_2+0x34/0x70 [test]
Aug 31 18:40:06 localhost kernel:
Aug 31 18:40:06 localhost kernel: but task is already holding lock:
Aug 31 18:40:06 localhost kernel: (&t_lock.tlock){+.+...}, at: [<ffffffffa02f7114>] test_func_level_1+0x34/0x70 [test]
Aug 31 18:40:06 localhost kernel:
Aug 31 18:40:06 localhost kernel: other info that might help us debug this:
Aug 31 18:40:06 localhost kernel: 1 lock held by insmod/32470:
Aug 31 18:40:06 localhost kernel: #0:  (&t_lock.tlock){+.+...}, at: [<ffffffffa02f7114>] test_func_level_1+0x34/0x70 [test]
Aug 31 18:40:06 localhost kernel:
Aug 31 18:40:06 localhost kernel: stack backtrace:
Aug 31 18:40:06 localhost kernel: Pid: 32470, comm: insmod Not tainted 2.6.32-131.21.1.b2.00 #4
Aug 31 18:40:06 localhost kernel: Call Trace:
Aug 31 18:40:06 localhost kernel: [<ffffffff810a53ed>] ? __lock_acquire+0x11bd/0x1560
Aug 31 18:40:06 localhost kernel: [<ffffffff8106503b>] ? vprintk+0x2cb/0x590
Aug 31 18:40:06 localhost kernel: [<ffffffff814f3699>] ? sub_preempt_count+0x9/0xa0
Aug 31 18:40:06 localhost kernel: [<ffffffff8106504a>] ? vprintk+0x2da/0x590
Aug 31 18:40:06 localhost kernel: [<ffffffff810a5838>] ? lock_acquire+0xa8/0x150
Aug 31 18:40:06 localhost kernel: [<ffffffffa02f70a4>] ? test_func_level_2+0x34/0x70 [test]
Aug 31 18:40:06 localhost kernel: [<ffffffff814f005b>] ? _spin_lock+0x3b/0x50
Aug 31 18:40:06 localhost kernel: [<ffffffffa02f70a4>] ? test_func_level_2+0x34/0x70 [test]
Aug 31 18:40:06 localhost kernel: [<ffffffffa02f70a4>] ? test_func_level_2+0x34/0x70 [test]
Aug 31 18:40:06 localhost kernel: [<ffffffffa02f711c>] ? test_func_level_1+0x3c/0x70 [test]
Aug 31 18:40:06 localhost kernel: [<ffffffffa02fa000>] ? init_module+0x0/0xd [test]
Aug 31 18:40:06 localhost kernel: [<ffffffffa02f718d>] ? test_lock_init+0x3d/0x44 [test]
Aug 31 18:40:06 localhost kernel: [<ffffffffa02fa009>] ? init_module+0x9/0xd [test]
Aug 31 18:40:06 localhost kernel: [<ffffffff8100204c>] ? do_one_initcall+0x3c/0x1d0
Aug 31 18:40:06 localhost kernel: [<ffffffff810b5123>] ? sys_init_module+0xe3/0x260
Aug 31 18:40:06 localhost kernel: [<ffffffff8100c1f2>] ? system_call_fastpath+0x16/0x1b
Aug 31 18:41:23 localhost kernel: BUG: soft lockup - CPU#3 stuck for 67s! [insmod:32470]
Aug 31 18:41:23 localhost kernel: Modules linked in: test(+)(U) nls_utf8 cifs sunrpc ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 iptable_filter ip_tables ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables ipv6 dm_mod i7core_edac edac_core sg i2c_i801 i2c_core iTCO_wdt iTCO_vendor_support e1000e ext4 mbcache jbd2 sd_mod crc_t10dif ahci [last unloaded: test]
Aug 31 18:41:23 localhost kernel: irq event stamp: 7163
Aug 31 18:41:23 localhost kernel: hardirqs last  enabled at (7163): [<ffffffff8100cc94>] restore_args+0x0/0x30
Aug 31 18:41:23 localhost kernel: hardirqs last disabled at (7161): [<ffffffff8106c7a1>] __do_softirq+0x131/0x230
Aug 31 18:41:23 localhost kernel: softirqs last  enabled at (7162): [<ffffffff8106c7d1>] __do_softirq+0x161/0x230
Aug 31 18:41:23 localhost kernel: softirqs last disabled at (7147): [<ffffffff8100d45c>] call_softirq+0x1c/0x30
Aug 31 18:41:23 localhost kernel: CPU 3:
Aug 31 18:41:23 localhost kernel: Modules linked in: test(+)(U) nls_utf8 cifs sunrpc ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 iptable_filter ip_tables ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables ipv6 dm_mod i7core_edac edac_core sg i2c_i801 i2c_core iTCO_wdt iTCO_vendor_support e1000e ext4 mbcache jbd2 sd_mod crc_t10dif ahci [last unloaded: test]
Aug 31 18:41:23 localhost kernel: Pid: 32470, comm: insmod Not tainted 2.6.32-131.21.1.b2.00 #4 To be filled by O.E.M.
Aug 31 18:41:23 localhost kernel: RIP: 0010:[<ffffffff814edc48>]  [<ffffffff814edc48>] preempt_schedule+0x8/0x60
Aug 31 18:41:23 localhost kernel: RSP: 0018:ffff8801ef0e1dc8  EFLAGS: 00000282
Aug 31 18:41:23 localhost kernel: RAX: ffff8801ef0e1fd8 RBX: ffff8801ef0e1dd8 RCX: 00000000d0a1e7be
Aug 31 18:41:23 localhost kernel: RDX: 000000000005a1d2 RSI: ffffffff817b358d RDI: 0000000000000001
Aug 31 18:41:23 localhost kernel: RBP: ffffffff8100cbce R08: 0000000000000002 R09: 0000000000000000
Aug 31 18:41:23 localhost kernel: R10: 0000000000000000 R11: 0000000000000002 R12: 0000000000000000
Aug 31 18:41:23 localhost kernel: R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
Aug 31 18:41:23 localhost kernel: FS:  00007fbba827c700(0000) GS:ffff880028380000(0000) knlGS:0000000000000000
Aug 31 18:41:23 localhost kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Aug 31 18:41:23 localhost kernel: CR2: 00007fbba822500f CR3: 00000001f54df000 CR4: 00000000000006e0
Aug 31 18:41:23 localhost kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Aug 31 18:41:23 localhost kernel: DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Aug 31 18:41:23 localhost kernel: Call Trace:
Aug 31 18:41:23 localhost kernel: [<ffffffff814f3699>] ? sub_preempt_count+0x9/0xa0
Aug 31 18:41:23 localhost kernel: [<ffffffff812894bb>] ? delay_tsc+0xeb/0xf0
Aug 31 18:41:23 localhost kernel: [<ffffffff8128936f>] ? __delay+0xf/0x20
Aug 31 18:41:23 localhost kernel: [<ffffffff8129ab40>] ? _raw_spin_lock+0x110/0x180
Aug 31 18:41:23 localhost kernel: [<ffffffff814f0063>] ? _spin_lock+0x43/0x50
Aug 31 18:41:23 localhost kernel: [<ffffffffa02f70a4>] ? test_func_level_2+0x34/0x70 [test]
Aug 31 18:41:23 localhost kernel: [<ffffffffa02f70a4>] ? test_func_level_2+0x34/0x70 [test]
Aug 31 18:41:23 localhost kernel: [<ffffffffa02f711c>] ? test_func_level_1+0x3c/0x70 [test]
Aug 31 18:41:23 localhost kernel: [<ffffffffa02fa000>] ? init_module+0x0/0xd [test]
Aug 31 18:41:23 localhost kernel: [<ffffffffa02f718d>] ? test_lock_init+0x3d/0x44 [test]
Aug 31 18:41:23 localhost kernel: [<ffffffffa02fa009>] ? init_module+0x9/0xd [test]
Aug 31 18:41:23 localhost kernel: [<ffffffff8100204c>] ? do_one_initcall+0x3c/0x1d0
Aug 31 18:41:23 localhost kernel: [<ffffffff810b5123>] ? sys_init_module+0xe3/0x260
Aug 31 18:41:23 localhost kernel: [<ffffffff8100c1f2>] ? system_call_fastpath+0x16/0x1b

Linux内核问题分析路径

Linux内核问题分析方法相关推荐

  1. Linux内核的编译方法及如何往内核中增加程序

    2019独角兽企业重金招聘Python工程师标准>>> ARM Linux的系统调用实现原理是采用swi软中断从用户(usr)模式陷入管理模式(svc). 内核空间和用户空间这两个名 ...

  2. Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...

    在把Linux内核源代码生成Image之前,需要把执行文件头结构信息剔除出来.这个过程对理解Linux内核具有很大的帮助.同时,由于是对可执行文件进行直接读写操作,想写DUL工具的童鞋可以在这里学习到 ...

  3. Linux内核部件分析 设备驱动模型之driver ---mark 详细

    Linux内核部件分析 设备驱动模型之driver 转载:https://www.linuxidc.com/Linux/2011-10/44627p7.htm 上节我们分析设备驱动模型中的device ...

  4. 《Linux内核情景分析》阅读笔记

    <Linux内核情景分析>这本书读过了一遍,不想继续读第二遍了. <Linux Kernel Development>这本书前后读了3遍,写得实在是好,正所谓"布衣暖 ...

  5. Linux内核源代码获取方法

    Linux内核源代码获取方法 什么叫Linux 什么叫Linux内核 Linux内核源代码的获取 什么叫Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UN ...

  6. linux内核源代码分析----内核基础设施之klist

    概述 klist是list的线程安全版本,他提供了整个链表的自旋锁,查找链表节点,对链表节点的插入和删除操作都要获得这个自旋锁.klist的节点数据结构是klist_node,klist_node引入 ...

  7. Linux内核源代码分析-目录

    第一部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 ...

  8. Android驱动(1)---Ubuntu中为Android系统上编写Linux内核驱动程序实现方法

    Ubuntu中为Android系统上编写Linux内核驱动程序实现方法 本文主要介绍在Ubuntu 上为Android系统编写Linux内核驱动程序, 这里对编写驱动程序做了详细的说明,对研究Andr ...

  9. Linux内核协议栈分析之——tcp/ip通信并不神秘

    Jack:计算机如何进行通信? 我:我可以告诉你带Linux操作系统的计算机如何进行通信. Jack:带Linux操作系统的计算机?这和不带操作系统的计算机有区别吗? 我:有的. Jack:哦.那你说 ...

最新文章

  1. 微服务系列(五):事件驱动的数据管理
  2. 各种SmartPhone上的跨平台开源框架的总结
  3. varnish---反向代理web加速缓存服务器和CDN的推送
  4. 自学ng2 -生命周期钩子
  5. 服务器信息化平台,管理系统的信息化平台.ppt
  6. jsp servlet中的过滤器Filter配置总结(转)
  7. java 里面matches什么意思_Java Regex中的matches()和find()之间的区别
  8. chart控件做实时曲线显示_组态王实时趋势曲线控件介绍,让你对此不再陌生
  9. 零拷贝技术在 Java 中为何这么牛?
  10. C#制作QQ截图的自动框选功能的个人思路(二)设置Hook
  11. BigPipe为什么可以节省时间?
  12. 使用xmarks同步 chrome ie firefox safari书签
  13. 来来来,给你看个宝贝儿~
  14. workman php 视频,利用workerman实现webrtc实时音视频通话
  15. sql数据库 ‘xxxxxx‘ 已存在,请选择其他数据库名称
  16. 将Jetson XavierNX的Ubuntu系统迁移至到nvme固态硬盘上
  17. python绘图 -- 小猪佩奇源码分享
  18. 在ts文件中引入js模块,编写声明文件的方法
  19. LSTM对比Bi-LSTM的电力负荷时间序列预测(Matlab)
  20. java实现简单控制台出租房屋管理系统

热门文章

  1. 《大话设计模式》之--第17章 在NBA我需要翻译----适配器模式
  2. 浏览器内核兼容测试工具
  3. 从0开始,在Linux中配置Nginx反向代理、负载均衡、session共享、动静分离
  4. 过零丁洋 文天祥(宋)
  5. button与input type=button 的区别
  6. USTC 1122:Millionaire Rank List
  7. PHP实现首字母头像
  8. 万户OA downloadhttp任意文件下载漏洞复现 CNVD-2016-06898
  9. html超链接换个颜色,html超链接颜色怎么改
  10. 沉睡者IT - 听我给你科普什么是WEB3.0?