"); //-->
Linux因其庞大,复杂(也许不是)至今并没有一个类似VB,VC,ADS等可视化调试工具,交叉编译环境的“麻烦”把很多想学linux的人挡在门外。
言归正传,下面介绍第一个调试技术
一:SLAB调试技术 1.1 SLAB调试的意义下面引用《linux设备驱动程序第三版》第四章的一段话:
“这个重要的选项打开了内核内存分配函数的几类检查; 激活这些检查, 就可能探测到一些内存覆盖和遗漏初始化的错误. 被分配的每一个字节在递交给调用者之前都设成 0xa5, 随后在释放时被设成 0x6b. 你在任何时候如果见到任一个这种"坏"模式重复出现在你的驱动输出(或者常常在一个 oops 的列表), 你会确切知道去找什么类型的错误. 当激活调试, 内核还会在每个分配的内存对象的前后放置特别的守护值; 如果这些值曾被改动, 内核知道有人已覆盖了一个内存分配区, 它大声抱怨. 各种的对更模糊的问题的检查也给激活了。”
1.2 CONFIG_DEBUG_SLAB在哪里打开书上说CONFIG_DEBUG_SLAB在kernel hacking配置菜单中
#make menuconfig
进入kernel hacking:
但是并没有看到CONFIG_DEBUG_SLAB,
这需要熟悉linux内核配置菜单的生成(自己去琢磨,顺藤摸瓜也不难发现)。
如图:
知道了吧!(不同的版本名字有不同)
=======================================================================================
By 下家山 QQ 408452271 Email:ximenpiaoxue4016@sina.com
7/30/2012 5/25 7:20:06 PM
Linux Kernel 调试技术 上海索漫科技 http://www.xiajiashan.com 专注ARM+Linux
1.3 根本就没有相关选项
有些版本在make menuconfig 后进入kernel hacking根本就没有SLAB的相关选项,此时你需要仔细研究lib/kconfig.debug了,把SLAB相关选项打开。Linux-2.6.19中kernel hacking里面还有DEBUG_SLAB_LEAK(内存泄漏)功能,应该是一个很好的调试功能,我还没有去试,哪位有时间去试一下,烦请把结果贴出来共享。下面是linux-2.6.19下的kernel hacking菜单:
Memory leak debugging需要在Debug slab memory allocations打开的情况下才显示。
=======================================================================================
By 下家山 QQ 408452271 Email:ximenpiaoxue4016@sina.com
7/30/2012 5/25 7:20:06 PM
Linux Kernel 调试技术 上海索漫科技 http://www.xiajiashan.com 专注ARM+Linux
1.4验证0x5a和0x6b
“在将已分配内存返回给调用者之前,内核将把其中的每个字节设置成0xa5,而在释放后将其设置成0x6b,如果读者在自己驱动程序的输出中,或者在OOPS信息中看到上述“毒剂”字符,则可以轻松判断问题所在”
真是如此吗?下面是我做的实验:
我写了个单独的模块,这个模块首先申请一块空间,然后释放。成功申请后即打印这块空间的值,看是否为0x5a,释放后再一次打印这块空间的值,看其是否为0x6b。其代码如下:
#include
#include
#include
unsigned char *slab_wr;
static int test _init(void)
{
int i;
printk(KERN_EMERG "slab_wr address before call kmalloc:0x%08lx \n",slab_wr);
slab_wr = (unsigned char *)kmalloc(512, GFP_KERNEL);
printk(KERN_EMERG "slab_wr address affter call kmalloc :0x%08lx \n",slab_wr);
for( i=0; i<200; i++)
{
printk(KERN_EMERG "0x%x ",*(slab_wr+i));
}
printk(KERN_EMERG "\nHello\n");
return 0;
}
static void test_exit(void)
{
int i;
kfree(slab_wr);
for( i=0; i<200; i++)
{
printk(KERN_EMERG "0x%x ",*(slab_wr+i));
}
printk(KERN_EMERG"\nGoodbye,\n");
}
module_init(test _init);
module_exit(test _exit);
下面是运行结果
=======================================================================================
By 下家山 QQ 408452271 Email:ximenpiaoxue4016@sina.com
7/30/2012 5/25 7:20:06 PM
Linux Kernel 调试技术 上海索漫科技 http://www.xiajiashan.com 专注ARM+Linux
证明完毕。
1.5 验证越界还是刚才那个程序:
//slabtest.c
#include
#include
#include
unsigned char *slab_wr; /* I/O data buffer */
static int slabtest_init(void)
{
int i;
printk(KERN_EMERG "slab_wr address before call kmalloc:0x%08lx \n",slab_wr);
slab_wr = (unsigned char *)kmalloc(100,GFP_USER/*GFP_KERNEL*/);
printk(KERN_EMERG "slab_wr address affter call kmalloc :0x%08lx \n",slab_wr);
for( i=0; i<101; i++)
{
*(slab_wr+i)=0xcc;
}
#if 0
for( i=0; i<200; i++)
{
printk(KERN_EMERG "0x%x ",*(slab_wr+i));
}
#endif
printk(KERN_EMERG "\nHello\n");
return 0;
}
=======================================================================================
By 下家山 QQ 408452271 Email:ximenpiaoxue4016@sina.com
7/30/2012 5/25 7:20:06 PM
Linux Kernel 调试技术 上海索漫科技 http://www.xiajiashan.com 专注ARM+Linux
static void slabtest_exit(void)
{
int i;
kfree(slab_wr);
#if 0
for( i=0; i<100; i++)
{
printk(KERN_EMERG "0x%x ",*(slab_wr+i));
}
#endif
printk(KERN_EMERG"\nGoodbye\n");
}
module_init(slabtest_init);
module_exit(slabtest_exit);
运行结果
即看到了”毒剂”字符
作者:下家山(请尊重原创, 转载请注明) http://www.xiajiashan.com,有什么问题可与我联系:ximenpiaoxue4016@sina.com
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
vxworks的doc启动--dos
Continua USB PHDC 演示
马瑞利面向软件定义汽车的下一代智能座舱创新技术亮相2026北京车展
钟控定时喷灌器电路
米尔RK3576 + ROS2 进阶:NPU加速MixFormerV2目标跟随与机械臂抓取实战
飞思卡尔QorIQ P4080 混合仿真
先进封装成AI芯片新瓶颈
采用了飞思卡尔产品的医疗应用
音频电路图
[专题]而立 人生中的一道坎
硬件技术资料(ZE5开发板资料)
自动循环定时器电路(CD406、CD4013)
用门电路组成的脉冲延迟电路(CD40106)
鲲游光电完成近4亿元融资,加速晶圆级光学研发
[职场]薪酬公平:样样都要摆平
脉冲延迟电路(CD4011、CD4098)
谁在为美国晶圆代工的未来买单?
用于电机调速的新型单片微机80C196MD详细介绍
全球智能手机市场短期回暖,未来或面临下滑压力
用CD4013组成的正、负极性脉冲延迟电路
Gartner:助力中国I&O负责人打破监控孤岛
3个经典科学展项目及其如何应对当今工程挑战
嵌入式winxp有没有FOR arm的?
三星主导垂直芯片研发:目标将HBM的 I/O 提升10倍、带宽提升 4 倍
[寓言]雨钦差出巡
采用Flexis AC MCU的机械手
在W78E58处理器上移植的uCOS-II
运算放大器应用基础
硅光子量产压力落晶圆测试链 「上电下光」结构成关键
飞思卡尔QorIQ