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] [...