编写驱动模块的时候,出现问题如何调试呢?
我在看宋宝华的《linux设备驱动开发详解》,看字符设备驱动那一节的时候,照着抄了书上的代码6.17。然后编译也通过了。
insmod globalmem.ko
然后 mknod /dev/globalmem c 252 0
可我在运行命令:echo "hello" > /dev/globalmem的时候,总是报错:
bash:echo:write error:Bad address.
我也不知道问题出在什么地方。也不知道怎么调试。
想问一下,编写模块的时候出现问题怎么调试啊。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
最简单的用printk来看调试信息,也可以用gdb
在内核模块中加上printk吧,这是最常用的。按照程序的流程,通过不同的位置printk,就可以定位程序的问题
用gdb咋调内核驱动啊?那不是把整个内核都中断了吗?
只调试你这个模块,可以查看一下相关资料
可是 有时候,出现oops直接就死机了,这种情况下怎么定位错误呢?
根据oops来定位,会提示你在哪个函数中导致的oop,然后你跟踪一下这个函数,一步一步确定出错源。
提示出错函数的相对位置, 比如 function_abc 0x10/0x50
就是在总目标代码0x50长度的0x10位置处。
再在原代码大概位置处检查语句。我是这么定位的。
不过根据这个相对位置,没办法精确对应原代码。
谁有好办法吗
一般来说能看个大概,具体点的话,要结合反汇编来看,前提是要对汇编有一定的熟悉,才知道这一行汇编对应到C代码中的哪一行了
LDD3中第3章说明了用GDB调试的方法,不过能调试的信息有限。