我是这样调试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
目录
相关文章
|
2月前
|
机器学习/深度学习 存储 PyTorch
Pytorch中in-place操作相关错误解析及detach()方法说明
Pytorch中in-place操作相关错误解析及detach()方法说明
151 0
|
3天前
|
消息中间件 监控 Serverless
函数计算操作报错合集之显示报错:RecursionError: maximum recursion depth exceeded while calling a Python object,该如何解决
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
8月前
|
测试技术 KVM 开发工具
【OS Pintos】Pintos 内核库基本数据结构 | 运行测试用例 alarm-multiple
【OS Pintos】Pintos 内核库基本数据结构 | 运行测试用例 alarm-multiple
89 0
|
2月前
|
芯片
ARM hint instruction-WFI(Wait For Interrupt)指令的一些笔记
ARM hint instruction-WFI(Wait For Interrupt)指令的一些笔记
147 0
|
Web App开发 C语言
分析 chrome 源码中 WARN_UNUSED_RESULT 宏
问题 今天浏览 chrome 源码时,发现了一个非常有意思的宏定义,它就是 WARN_UNUSED_RESULT ,用法如下图所示:
346 0
rxjs pipe和filter组合的一个实际例子的单步调试
rxjs pipe和filter组合的一个实际例子的单步调试
231 0
rxjs pipe和filter组合的一个实际例子的单步调试
rxjs pipe和map组合的一个实际例子的单步调试
rxjs pipe和map组合的一个实际例子的单步调试
132 0
rxjs pipe和map组合的一个实际例子的单步调试
rxjs的pipe和map配合使用的单步调试
rxjs的pipe和map配合使用的单步调试
192 0
rxjs的pipe和map配合使用的单步调试
VC++调试,TRACE()函数的用法
VC++调试,TRACE()函数的用法
147 0
VC++调试,TRACE()函数的用法