Linux内核问题分析方法
定位内核问题难点
- 死机没有现场或信息不全,有信息无法进一步分析;
- 调试困难,gdb只能作为辅助;
- 内核庞杂,系统代码量大,无从下手;
- 问题的表现和问题的原因不一定直接关联。linux内核堆栈大多是我们开发的模块问题。
Linux内核问题分类
- 按问题源头分:原生内核&开发模块
- 按严重层度分:致命问题&严重问题
- 按分析难易分:有现场&没有现场
- 内核问题常见表现:
kernel panic
死锁(忙等和挂死)
内存泄漏
Warning
准备工作
- 工欲善其事必先利其器
- 必胜的信心
Linux内核分析工具箱
调试工具:gdb、ftrace、systemtap
反汇编:objdump
现场分析:kdump & crash
预警工具:各种debug
核心要素:代码是所有问题分析的最核心要素,没有之一。
现场分析
现场分析
准备工作(内核源码)
堆栈信息分析(x86架构)
堆栈深入分析(x86架构)
- 函数反汇编,找到对应行。(GDB或objdump输出饭汇编)
- 分析错误行,结合反汇编分析出错的C语言代码。(GDB)
- 结合反汇编和栈信息,分析出错的内存数据,找到对应的数据。(GDB和kdump信息)
- 根据流程分析出现错误的原因。
详情见博客: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内核问题分析方法相关推荐
- Linux内核的编译方法及如何往内核中增加程序
2019独角兽企业重金招聘Python工程师标准>>> ARM Linux的系统调用实现原理是采用swi软中断从用户(usr)模式陷入管理模式(svc). 内核空间和用户空间这两个名 ...
- Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...
在把Linux内核源代码生成Image之前,需要把执行文件头结构信息剔除出来.这个过程对理解Linux内核具有很大的帮助.同时,由于是对可执行文件进行直接读写操作,想写DUL工具的童鞋可以在这里学习到 ...
- Linux内核部件分析 设备驱动模型之driver ---mark 详细
Linux内核部件分析 设备驱动模型之driver 转载:https://www.linuxidc.com/Linux/2011-10/44627p7.htm 上节我们分析设备驱动模型中的device ...
- 《Linux内核情景分析》阅读笔记
<Linux内核情景分析>这本书读过了一遍,不想继续读第二遍了. <Linux Kernel Development>这本书前后读了3遍,写得实在是好,正所谓"布衣暖 ...
- Linux内核源代码获取方法
Linux内核源代码获取方法 什么叫Linux 什么叫Linux内核 Linux内核源代码的获取 什么叫Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UN ...
- linux内核源代码分析----内核基础设施之klist
概述 klist是list的线程安全版本,他提供了整个链表的自旋锁,查找链表节点,对链表节点的插入和删除操作都要获得这个自旋锁.klist的节点数据结构是klist_node,klist_node引入 ...
- Linux内核源代码分析-目录
第一部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 ...
- Android驱动(1)---Ubuntu中为Android系统上编写Linux内核驱动程序实现方法
Ubuntu中为Android系统上编写Linux内核驱动程序实现方法 本文主要介绍在Ubuntu 上为Android系统编写Linux内核驱动程序, 这里对编写驱动程序做了详细的说明,对研究Andr ...
- Linux内核协议栈分析之——tcp/ip通信并不神秘
Jack:计算机如何进行通信? 我:我可以告诉你带Linux操作系统的计算机如何进行通信. Jack:带Linux操作系统的计算机?这和不带操作系统的计算机有区别吗? 我:有的. Jack:哦.那你说 ...
最新文章
- 微服务系列(五):事件驱动的数据管理
- 各种SmartPhone上的跨平台开源框架的总结
- varnish---反向代理web加速缓存服务器和CDN的推送
- 自学ng2 -生命周期钩子
- 服务器信息化平台,管理系统的信息化平台.ppt
- jsp servlet中的过滤器Filter配置总结(转)
- java 里面matches什么意思_Java Regex中的matches()和find()之间的区别
- chart控件做实时曲线显示_组态王实时趋势曲线控件介绍,让你对此不再陌生
- 零拷贝技术在 Java 中为何这么牛?
- C#制作QQ截图的自动框选功能的个人思路(二)设置Hook
- BigPipe为什么可以节省时间?
- 使用xmarks同步 chrome ie firefox safari书签
- 来来来,给你看个宝贝儿~
- workman php 视频,利用workerman实现webrtc实时音视频通话
- sql数据库 ‘xxxxxx‘ 已存在,请选择其他数据库名称
- 将Jetson XavierNX的Ubuntu系统迁移至到nvme固态硬盘上
- python绘图 -- 小猪佩奇源码分享
- 在ts文件中引入js模块,编写声明文件的方法
- LSTM对比Bi-LSTM的电力负荷时间序列预测(Matlab)
- java实现简单控制台出租房屋管理系统