我是这样调试kernel的race condition的, 超有用

简介: 内核调试中, 经常会有race, 方便的调试方法可以手动造一个环境出来模拟一下我们想要的时序, 来验证想法. * * * 比如说, a, b, 2个task, 想让a跑到某行指令的时候, 暂停运行, 然后让b运行来尝试进入共有的临界区, 一种最简单的想法就是在a的代码中加入sleep, sleep其实会引发调度, 所以就改成while 1, 改成while 1, 其他task跑

内核调试中, 经常会有race, 方便的调试方法可以手动造一个环境出来模拟一下我们想要的时序, 来验证想法.

    • *

比如说, a, b, 2个task, 想让a跑到某行指令的时候, 暂停运行, 然后让b运行来尝试进入共有的临界区,
一种最简单的想法就是在a的代码中加入sleep,
sleep其实会引发调度, 所以就改成while 1,
改成while 1, 其他task跑到这里的时候也会生效,
所以加if条件语句,
这些方法公有的缺点都是需要改代码, 重新编译,
下面是一种不用改代码的方法

    • *

首先设置断点, 然后程序中断到这里之后, 把rip的值改到一个while 1里面去

比如现在task 9171停到了kswapd_try_to_sleep+281
然后把rip改成bogus_64_magic去
然后让系统继续跑

(gdb) p $lx_current()->pid
$3 = 9171
(gdb) p $rip
$4 = (void (*)()) 0xffffffff81182679 <kswapd_try_to_sleep+281>
(gdb) x/i bogus_64_magic
   0xffffffff81049427 <bogus_64_magic>: jmp    0xffffffff81049427 <bogus_64_magic>
(gdb) p $rip = bogus_64_magic
$5 = (void (*)()) 0xffffffff81049427 <bogus_64_magic>
(gdb)
(gdb)c

这样task 9171就相当于在某条指令之后就不跑了, cpu占用100, 符合预期

9171 root      20   0       0      0      0 S 100.0
    • *

然后执行task b的命令, 爱跑什么跑什么

然后就是把task a回来接着跑, 刚才是在kswapd_try_to_sleep+281中断的, 那现在就回到这里, 然后继续跑就可以了

(gdb) c
Continuing.

Thread 8 received signal SIGINT, Interrupt.
bogus_64_magic () at arch/x86/kernel/acpi/wakeup_64.S:39
(gdb) p $rip = kswapd_try_to_sleep+281
$6 = (void (*)()) 0xffffffff81182679 <kswapd_try_to_sleep+281>
(gdb) c
Continuing.

就可以很方便的构造race环境来验证问题

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
安全 Unix Shell
|
10月前
|
机器学习/深度学习 存储 PyTorch
Pytorch中in-place操作相关错误解析及detach()方法说明
Pytorch中in-place操作相关错误解析及detach()方法说明
421 0
|
8月前
|
算法 索引 Python
|
8月前
switch的使用细节
switch的使用细节
63 0
Asterisk Race Condition Test
Asterisk Race Condition Test 1.       Cancel Invite Race : Asterisk receive 200 from callee before CANCEL from Caller     2.
644 0
|
XML Android开发 数据格式
AndroidStudio Analyze->run inspection by name (查找未使用资源和潜在空指针)
AndroidStudio Analyze->run inspection by name (查找未使用资源和潜在空指针)
AndroidStudio Analyze->run inspection by name (查找未使用资源和潜在空指针)
|
Java
synchronize 三大作用、三大用法
synchronize 三大作用、三大用法
132 0
|
缓存 开发框架 运维
C#好代码学习笔记(1):文件操作、 读取文件、Debug/Trace类、Conditional条件编译、CLS
C#好代码学习笔记(1):文件操作、 读取文件、Debug/Trace类、Conditional条件编译、CLS
243 0