Linux死锁调试之softlockup
Kernel branch: 3.0.35
概要:
softlockup 主要用于检测内核的进程调度是否正常,当发生softlockup时,内核不能被调度,
但是中断还是可以响应,而hrtimer属于中断的下半部,所以此情况下也可以响应。
原理:
系统在每个cpu上创建一个内核线程,当hrtimer定期执行的回调后会尝试唤醒此线程,如果线程有被正常调度而被唤醒,
它会更新时间变量watchdog_touch_ts,如果没有则不会更新。在hrtimer的回调函数中会判断watchdog_touch_ts和当前
时间差,如果超过给定值,那就证明内核调度失败,接着就打印异常log。
code流程大概:
lockup_detector_init ->
cpu_callback -> //action CPU_UP_PREPARE
watchdog_prepare_cpu -> //hrtimer对应function是watchdog_timer_fn
cpu_callback ->
watchdog_enable ->
kthread_create -> //为每个cpu创建名字叫watchdog/x的thread, x是cpu number,对应function为watchdog().
watchdog ->
sched_priority = MAX_RT_PRIO-1 //设置线程优先级成最高
__touch_watchdog //初始化watchdog_touch_ts为当前时间
hrtimer_start //启动timer,时间周期从get_sample_period(),由watchdog_thresh决定,
除5是在触发hardlockup之前给hrtimer5次机会触发,后面文章会提到hardlockup。
__touch_watchdog //重新更新时间戳。
schedule //睡眠等待设置时间后hrtimer触发
watchdog_timer_fn -> //hrtimer被触发
wake_up_process //唤醒前面休眠的进程
hrtimer_forward_now //重新设置hrtimer
is_softlockup //如果计算时间差超过了最大时间,证明没有进程调度了、
print_modules //打印信息。
dump_stack //打印堆栈信息。
另一方面,watchdog线程会被唤醒,然后执行__touch_watchdog 会重新更新watchdog_touch_ts。
测试例子:
在某个线程里添加如下语句:
preempt_disable();
while(1);
然后过会就会打印如下log:
[ 28.548865] BUG: soft lockup - CPU#1 stuck for 22s! [us kthread:1106]
[ 28.555378] Modules linked in:
[ 28.558566]
[ 28.560173] Pid: 1106, comm: us kthread
[ 28.564951] CPU: 1 Not tainted (3.0.35-00007-g60f7071-dirty #153)
[ 28.571528] PC is at ks103_ultrasonic_thread+0x18/0x1c
[ 28.576750] LR is at kthread+0x80/0x88
[ 28.580566] pc : [<c0357084>] lr : [<c00ab1c8>] psr: 60000013
[ 28.580571] sp : d441bfc8 ip : c08ba7d0 fp : 00000000
[ 28.592249] r10: 00000000 r9 : 00000000 r8 : 00000000
[ 28.597599] r7 : 00000013 r6 : c035706c r5 : 00000000 r4 : d402fe94
[ 28.604202] r3 : d441a000 r2 : 00000001 r1 : d4044560 r0 : 00000000
[ 28.610854] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
[ 28.618287] Control: 10c53c7d Table: 1000404a DAC: 00000015
[ 28.624095]
[ 28.624098] PC: 0xc0357004:
[ 28.628502] 7004 ebffffaa e58d0004 eaffffd7 e59f1034 e59f0040 eb0c4e8a e3a00003 ebffffa3
[ 28.637449] 7024 e59f2034 e59f101c e1a03000 e59f002c e3530000 e58d3004 01a02000 e59f0020
[ 28.646433] 7044 eb0c4e7f eaffffc8 c06a73cc c07e9fdc c07e9ffc c07ea018 c07ea038 c07e9fc4
[ 28.655417] 7064 c07e9fd4 c07ea058 e1a0200d e3c23d7f e3c3303f e5932004 e2822001 e5832004
[ 28.664414] 7084 eafffffe e92d4008 e3a00000 e59f1008 ebfe1658 e3a00000 e8bd8008 c0972128
[ 28.673356] 70a4 e92d4008 e3a00000 e59f100c ebfe2136 e3500000 13e0000f e8bd8008 c0972128
[ 28.682303] 70c4 e3a03001 e3443004 e1510003 e92d4010 e1a04002 0a000007 e3a03002 e3443004
[ 28.691325] 70e4 e1510003 0a000012 e59f00b4 eb0c4e54 e3e00015 e8bd8010 e59f00a8 eb0c6694
参考:
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=14528823&id=4215888
Linux死锁调试之softlockup相关推荐
- linux将程序锁死,Linux死锁现象及分析方法(转)
本节我们对Linux死锁做一个基本的介绍,然后讲解如何检测并定位死锁. 1. 什么是死锁? 死锁(DeadLock)是指两个或者两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象 ...
- Linux内核调试方法【转】
转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...
- 开源项目-基于Intel VT技术的Linux内核调试器
本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...
- Linux内核调试 - 一般人儿我都不告诉他(一)【转】
转自:http://www.cnblogs.com/armlinux/archive/2011/04/14/2396821.html 悄悄地进入Linux内核调试(一) 本文基址:http://blo ...
- linux内核调试技术 kprobe使用与实现
Linux kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术.利用kprobes技术,内核开发人员可以在内核的绝大多数指定函数中动态的插入探测点来收集 ...
- 基于IntelVt技术的Linux内核调试器 - 2
4 基于IntelVt技术的Linux内核调试器- 调试器设计与实现(2):调试核心 4.1反汇编引擎 如果说调试框架是一个调试器的灵魂,那么接口与反汇编引擎就是一个调试器的身体.我们在调试过程中是要 ...
- 第10章 嵌入式linux的调试技术
一. 防止函数printk降低linux性能: 利用C语言中的编译指令(#if.#else.#endif等). 现在修改printk_demo驱动代码,通过编译指令定义了一个pr_debug ...
- linux下调试core dump方式汇总,工作必备技能
缘起 调试,是开发流程中一个非常重要的环节.每个程序员都应,具备调试代码的能力,尤其对于从事 Linux 下的开发的读者. 从事 linux 下后台开发,有时候会遇到程序突然崩溃的情况,也没有任何日志 ...
- python 如何在linux进行调试
文章目录 如何在linux进行调试python,很多公司的是服务器,而服务器上面的python,打开只有shell 模式,如果你要观察某个变量是不方便的. 最方便的方式是: > python - ...
最新文章
- NC:港大张彤团队-基于组学的耐药基因风险评估框架
- 由浅入深之Tensorflow(3)----数据读取之TFRecords
- 解决计算机名修改或作业移植导致的服务器名问题.sql
- 中英文怎么算 字符长度_如何将混合了中英文及不同数量空格的文本,快速拆分成多列...
- Java黑皮书课后题第3章:**3.15(游戏:彩票)修改程序清单3-8,产生三位整数的彩票。程序提示用户输入一个三位整数,然后依照规则判定用户是否赢得奖金
- 百度地图API的第一次接触——标注和信息窗的使用
- 一站式 Java Web 框架 firefly-2.0_07发布
- 大厂面试算法系列-如何从无序链表中移除重复项(一)-顺序删除
- 想设计亿万级高并发架构,你要先知道高并发是什么?
- 图解算法系列笔记(三)
- 深度学习根据文字生成图片教程(附python代码)
- 很久很久之前的一道面试题(老师的生日是那一天?)~
- 4. php运行过程时序图
- 南京超过广州,4 月程序员工资统计出炉,平均14596元
- 如何查看手机里的.db数据库文件
- oc 中正则表达式不区分中英文分号的问题
- 拜耳新一代犬体内驱虫药拜宠清登陆中国市场
- everything无法搜索刚插入的硬盘中的文件
- 看图猜地理-黑龙江篇
- 批量移动文件夹到对应文件夹
热门文章
- 【聆思CSK6 视觉AI开发套件试用】体验AI功能
- 基站网口损坏检查方法
- [AD17] 使用元器件向导为元件绘制PCB封装
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- Cadence Allegro调整丝印技巧-先自动调整再手动微调图文教程及视频演示
- 艾美智能影库服务器ip,艾美影库MS-300 到底怎么样?
- RRT(rapidly exploring random tree)算法学习笔记,机器人自主探索,路径规划
- 港科夜闻|香港科大商学院成为香港唯一一间入选最能发挥正面价值商学院
- 悟空,愿你永不怕天高地厚
- 【论文投稿】(一)新手向投稿准备