linux中的內(nèi)核死鎖調(diào)試
linux內(nèi)核死鎖調(diào)試
使用內(nèi)核的kernel hacking功能
打開(kāi)以下配置
CONFIG_PROVE_LOCKING=y CONFIG_LOCK_STAT=y CONFIG_DEBUG_LOCKDEP=y
重新編譯內(nèi)核后,
proc目錄下會(huì)有l(wèi)ockdep lockdep_stats lockdep_chains說(shuō)明lockdep模塊已經(jīng)生效
測(cè)試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);
測(cè)試打?。?/p>
[ 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
很明顯可以看出死鎖的發(fā)生路徑與調(diào)用棧
hack_spinAB在申請(qǐng)spin_lock(&hack_spinB)時(shí)死鎖了
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux CentOS下安裝Tomcat9及web項(xiàng)目的部署
本文講解在Linux CentOS下安裝Tomcat9,以及Web項(xiàng)目的部署發(fā)布過(guò)程,通過(guò)實(shí)例代碼相結(jié)合的形式給大家介紹的非常的詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07
詳解Linux 服務(wù)管理兩種方式service和systemctl
systemd是Linux系統(tǒng)最新的初始化系統(tǒng)(init),作用是提高系統(tǒng)的啟動(dòng)速度,盡可能啟動(dòng)較少的進(jìn)程,盡可能更多進(jìn)程并發(fā)啟動(dòng)。這篇文章主要介紹了Linux 服務(wù)管理兩種方式service和systemctl,需要的朋友可以參考下2019-09-09
linux expect 自動(dòng)登錄交換機(jī)保存配置的方法
今天小編就為大家分享一篇linux expect 自動(dòng)登錄交換機(jī)保存配置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
如何使用win10內(nèi)置的linux系統(tǒng)啟動(dòng)spring-boot項(xiàng)目
這篇文章主要介紹了如何使用​win10內(nèi)置的linux系統(tǒng)啟動(dòng)spring-boot項(xiàng)目,需要的朋友可以參考下2020-07-07
Linux中大內(nèi)存頁(yè)Oracle數(shù)據(jù)庫(kù)優(yōu)化的方法
這篇文章主要給大家介紹了關(guān)于Linux中大內(nèi)存頁(yè)Oracle數(shù)據(jù)庫(kù)優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
淺析CentOS8虛擬機(jī)訪問(wèn)Windows10主機(jī)文件夾方法
這篇文章主要介紹了CentOS8虛擬機(jī)訪問(wèn)Windows10主機(jī)文件夾方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
CentOS 7 虛擬機(jī)無(wú)法開(kāi)機(jī)問(wèn)題的快速解決方法
這篇文章主要介紹了CentOS 7 虛擬機(jī)無(wú)法開(kāi)機(jī)問(wèn)題的快速解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-11-11
Linux環(huán)境部署DNF倉(cāng)庫(kù)以及配置NFS共享服務(wù)
本文詳細(xì)介紹了如何在Linux環(huán)境下部署DNF倉(cāng)庫(kù)和配置NFS共享服務(wù),DNF倉(cāng)庫(kù)主要用于集中管理軟件包,而NFS共享服務(wù)則用于多系統(tǒng)間的文件共享,文章涵蓋了從倉(cāng)庫(kù)部署、軟件包同步到NFS配置和客戶端訪問(wèn)的全過(guò)程,為系統(tǒng)管理員提供了全面的指導(dǎo)2025-04-04

