linux中的内核死锁调试

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

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)时死锁了

总结

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

相关文章

  • Centos 7.4中的远程访问控制的实现方法

    Centos 7.4中的远程访问控制的实现方法

    这篇文章主要介绍了Centos 7.4中的远程访问控制的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 谈一谈Linux系统重要的子目录问题

    谈一谈Linux系统重要的子目录问题

    这篇文章主要介绍了Linux系统重要的子目录问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-09-09
  • LINUX中如何查看某个端口是否被占用的方法

    LINUX中如何查看某个端口是否被占用的方法

    这篇文章主要介绍了LINUX中如何查看某个端口是否被占用的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Linux系统 Centos7.4手动在线升级到Centos7.7

    Linux系统 Centos7.4手动在线升级到Centos7.7

    这篇文章主要介绍了Centos7.4手动升级到Centos7.7,需要的朋友可以参考下
    2022-01-01
  • 详解Linux下安装php环境并且配置Nginx支持php-fpm模块

    详解Linux下安装php环境并且配置Nginx支持php-fpm模块

    本篇文章主要介绍了详解Linux下安装php环境并且配置Nginx支持php-fpm模块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • Linux下安装jdk包含卸载OpenJDK介绍

    Linux下安装jdk包含卸载OpenJDK介绍

    大家好,本篇文章主要讲的是Linux下安装jdk包含卸载OpenJDK介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 用rsync对网站进行镜像备份实现步骤

    用rsync对网站进行镜像备份实现步骤

    对系统管理员来说,平时的工作重心应该集中在维护系统正常运转,能够正常提供服务上,这里往往牵涉到一个数据备份的问题
    2009-03-03
  • centos下搭建SVN服务器和MySQL

    centos下搭建SVN服务器和MySQL

    这篇文章主要为大家详细介绍了centos下搭建SVN服务器和MySQL的相关教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • apache 开启重定向 rewrite的实现方法

    apache 开启重定向 rewrite的实现方法

    这篇文章主要介绍了apache 开启重定向 rewrite的实现方法的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • linux中设置固定ip的方法(亲测有效)

    linux中设置固定ip的方法(亲测有效)

    这篇文章主要介绍了linux设置固定ip的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论