LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1534|回复: 6

内核调试为何进不了mod->init()?

[复制链接]
发表于 2008-5-4 19:04:13 | 显示全部楼层 |阅读模式
使用kgdb内核调试,自己编译了一个小内核模块,加载前,在sys_init_module中mod->init()设置断点,然后运行insmod加载,断点停下来后,单步执行s,怎么也进不了init,
请问是不是符号没有加载啊?怎么加上去?

谢谢!
 楼主| 发表于 2008-5-6 19:22:25 | 显示全部楼层
我在mod->init()处断下来,使用add-symbol-file把该模块的.bss .text .data都加载上去了,但单步执行还是进不去啊,
在module_init函数里面设置了断点也没有用,
但是在module_exit里设置的断点在rmmod时正常断下来了。

请问还会有什么原因呀?
回复 支持 反对

使用道具 举报

发表于 2008-5-7 00:11:29 | 显示全部楼层
看一下是不是中断和异常影响的,因为KGDB是用串口的中断及CPU的调试异常来实现的,如果符号表和代码段没问题的话可以查一下。另外,编译内核用-O2的话会导致代码在单步的时候有错位的现象,你遇到了吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-7 18:20:40 | 显示全部楼层
Post by 无人喝彩;1846568
看一下是不是中断和异常影响的,因为KGDB是用串口的中断及CPU的调试异常来实现的,如果符号表和代码段没问题的话可以查一下。另外,编译内核用-O2的话会导致代码在单步的时候有错位的现象,你遇到了吗



“编译内核用-O2”我在编译的时候把2已经去掉了,今天在公司重新编译了一遍,还是这样的现象。记得以前在家用虚拟机时成功过,真不知道是哪里设置有问题。

怎么样查看中断或异常影响?
回复 支持 反对

使用道具 举报

发表于 2008-5-7 19:36:55 | 显示全部楼层
检查硬件中断的话,可以查看CPU的MSU字节,其中有标识开关中断的位。检查异常比较麻烦,最直接的办法是修改你目标机器架构下的linux的入口汇编。对每个异常入口处添加打印信息。
其实我不确定你遇到的问题是中断或者异常造成的,仅提供一种思路。毕竟我没有看见你实际的环境,不过希望能和你继续交流
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-8 18:00:43 | 显示全部楼层
我发现一个奇怪问题,比如模块A.ko,使用insmod加载后,那么在/sys/module/A/sections/.data(.text...),查看的数值是不是其真实加载的地址?

为什么我在程序中加入打印语句输出初始化函数地址,并不是上面取得的.text地址呢?
回复 支持 反对

使用道具 举报

发表于 2008-5-8 23:01:06 | 显示全部楼层
你说的这个我没有注意过,模块加载的代码段地址是动态链接进去的,如果你觉得两个值不一样的话,我觉得还是以你打印出的为准吧(如果你加打印没有什么问题的话),有兴趣的话,你也可以查一下加载模块那部分代码。这是解决问题最直接的办法吧:)看一遍,会有很多提高的,你说呢
ps:看完了,给大家讲讲,呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表