linux中的内核死锁调试

linux中的内核死锁调试

 更新时间:2024年02月12日 18:19:59   作者:来自深渊的凝视  
这篇文章主要介绍了linux中的内核死锁调试方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

目录
  • linux内核死锁调试
    • 打开以下配置
    • 测试code
  • 总结

    linux内核死锁调试

    使用内核的kernel hacking功能

    打开以下配置

    CONFIG_PROVE_LOCKING=y
    CONFIG_LOCK_STAT=y
    CONFIG_DEBUG_LOCKDEP=y

    重新编译内核后,

    proc目录下会有lockdep lockdep_stats lockdep_chains说明lockdep模块已经生效

    测试code

    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/slab.h>
    
    static DEFINE_SPINLOCK(hack_spinA);
    static DEFINE_SPINLOCK(hack_spinB);
    #ifdef MEMORY_TEST
    static char* buf;
    static void create_slue_err(void){
        buf = kmalloc(32,GFP_KERNEL);
        if(buf)  {
            /*memset(buf,0x00,33);*/
        /*  kfree(buf);
            printk("%s\n","free buf" );*/
            /*kfree(buf);*/
            memset(buf,0x00,33);
        }
    
        return;
    }
    #endif
    void hack_spinBA(void) {
        printk("%s\n","hack_spin:B=>A\n" );
        spin_lock(&hack_spinA);
        spin_lock(&hack_spinB);
    }
    
    void hack_spinAB(void) {
        printk("%s\n","hack_spin:A=>B\n" );
        spin_lock(&hack_spinB);
    }
    
    static int __init my_test_init(void) {
        printk("init %s\n", "my_test_init 1");
    #ifdef MEMORY_TEST 
        create_slue_err();
    #endif
        hack_spinBA();
        hack_spinAB();
        printk("init %s\n", "my_test_init 2");
        return 0;
    }
    
    static void __exit my_test_exit(void) {
        printk("%s\n","my_test_exit" );
        return ;
    }
    MODULE_LICENSE("GPL");
    module_init(my_test_init);
    module_exit(my_test_exit);
    

    测试打印:

    [  188.596504@1] init my_test_init 1
    [  188.596548@1] hack_spin:B=>A
    [  188.596548@1] 
    [  188.598679@1] hack_spin:A=>B
    [  188.598679@1] 
    [  189.920389@1] BUG: spinlock lockup suspected on CPU#1, insmod/6999
    [  189.920943@1]  lock: hack_spinB+0x0/0xfffffffffffffef4 [slub_test], .magic: dead4ead, .owner: insmod/6999, .owner_cpu: 1
    [  189.931758@1] CPU: 1 PID: 6999 Comm: insmod Tainted: G           O 3.14.29 #6
    [  189.938784@1] Call trace:
    [  189.941406@1] [<ffffffc0010893f8>] dump_backtrace+0x0/0x144
    [  189.946896@1] [<ffffffc001089558>] show_stack+0x1c/0x28
    [  189.952120@1] [<ffffffc001b5b480>] dump_stack+0x74/0xb8
    [  189.957247@1] [<ffffffc0010fb6d4>] spin_dump+0x78/0x98
    [  189.962369@1] [<ffffffc0010fb904>] do_raw_spin_lock+0x170/0x1a8
    [  189.968199@1] [<ffffffc001b670a8>] _raw_spin_lock+0x68/0x88
    [  189.973764@1] [<ffffffbffc00507c>] hack_spinAB+0x30/0x3c [slub_test]
    [  189.980015@1] [<ffffffbffc00d028>] $x+0x28/0x4c [slub_test]
    [  189.985566@1] [<ffffffc0010816d4>] do_one_initcall+0xd4/0x13c
    [  189.991257@1] [<ffffffc00112c2f8>] load_module+0x16d8/0x1e08
    [  189.996834@1] [<ffffffc00112cba0>] SyS_finit_module+0x80/0x90

    [  211.641019@1] INFO: rcu_sched detected stalls on CPUs/tasks: { 1} (detected by 2, t=2104 jiffies, g=18446744073709551337, c=18446744073709551336, q=4)
    [  211.648804@2] Task dump for CPU 1:
    [  211.652167@2] insmod          R  running task        0  6999   5821 0x0000000a
    [  211.659325@2] Call trace:
    [  211.661920@2] [<ffffffc001085f10>] __switch_to+0x74/0x8c

    很明显可以看出死锁的发生路径与调用栈

    hack_spinAB在申请spin_lock(&hack_spinB)时死锁了

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:

    • Linux内核启动流程之start_kernel问题
    • 深入理解Linux网络之内核是如何发送网络包的
    • 一文学会使用Linux内核模块&proc实例统计所有进程信息
    • Linux内核页表及页表缓存原理
    • Linux内核中的设计模式之全面理解与示例代码


    • linux
    • 内核
    • 死锁

    相关文章

    • Linux下重新启动Tomcat的步骤详解

      这篇文章主要给大家介绍了Linux下重新启动Tomcat的步骤,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。 2017-03-03

    • httpd.conf 二级域名设置方法

      首先,你的拥有一个有泛域名解析的顶级域名,例如: domain.com 其次,在 httpd.conf 中打开 mod_rewrite 2009-02-02

    • Linux date命令的使用

      这篇文章主要介绍了Linux date命令的使用,帮助大家更好的理解和学习Linux,感兴趣的朋友可以了解下 2020-08-08

    • ubuntu系统下禁用utc时间的设置方法

      这篇文章主要给大家介绍了在ubuntu系统下禁用utc时间的设置方法,需要的朋友可以参考下 2017-05-05

    • 浅析ARM架构下的函数的调用过程

      本文主要介绍了linux程序运行的状态以及如何推导调用栈。 2021-05-05

    • 浅谈Linux下修改/设置环境变量JAVA_HOME的方法

      这篇文章主要介绍了浅谈Linux下修改/设置环境变量JAVA_HOME的方法,环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。感兴趣的可以了解一下 2020-07-07

    • 详解linux系统中设置SFTP服务用户目录权限的方法

      这篇文章主要给大家介绍了Linux系统中设置SFTP服务用户目录权限的方法,文中给出了详细的设置方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。 2016-12-12

    • thrift安装遇到的问题以及解决方法(必看篇)

      下面小编就为大家带来一篇thrift安装遇到的问题以及解决方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2016-12-12

    • 解决yum安装报错Protected multilib versions的问题

      今天小编就为大家分享一篇解决yum安装报错Protected multilib versions的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 2019-07-07

    • 通过 SSH 在远程 Linux 系统上运行命令的方法

      这篇文章主要介绍了通过 SSH 在远程 Linux 系统上运行命令的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 2019-10-10

    最新评论

    版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
    文章名称:《linux中的内核死锁调试》
    文章链接:https://zhuji.vsping.com/196718.html
    本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。