声明:
在注明出处的条件下可以随意应用(blog.youkuaiyun.com/innotech)。
上一篇文章(kgdb vmware设置)已经说了如何在机器上面通过虚拟机设置两个机器进行kgdb调试。在实现内核可以调试的情况下。我们下面将讲解有关module的调试方法。
其实module的调试方法很简单。先来说明一些问题。
系统启动时的参数如ro kgdb=ttyS*,115200 kgdboc=ttyS*,115200 kgdbwait.
这些参数都可以在系统启动后传递给模块如echo kgdboc=ttyS*,115200>/sys/module/kgdboc/parameter即可设置串口参数。echo g>/proc/sysrq-tirgger即可打开kgdb调试状态。所以说这些参数不一定要在启动是传入。并且ro是readonly的意思,如果要设置断点的话。就不能有ro参数了。
我们设置参数如kgdb=ttyS*,115200。进入系统。
在develop机器上我们输入gdb vmlinux。系统将会加载vmlinux的信息。
在target机器上我们输入echo g>/proc/sysrc-trigger[enter]。此时系统处于殭死状态。
develop)(gdb)target remote /dev/ttyS*[enter]
这个时候两台机器就会连接在一起了。即可进行调试。
develop)(gdb)c[enter]
target机器将会继续执行,我们这个时候就可以加载模块了。
target)#insmod <module name>
target)#cat /sys/modules/chardev/section/.text[enter]
target)#cat /sys/modules/chardev/section/.bss[enter]
target)#cat /sys/modules/chardev/section/.data[enter]
将会分别的到.text .bss .data的具体加载位置,为0x开头
得到位置以后我们就可以在develop机器上面调试了。中断target机器。
develop机器上gdb将会处于等待输入状态。这个时候我们将要加载模块的地址信息用add-symbol-file。我们将输入如下
add-symbol-file <module name> ADDR -s .data ADDR -s .bss ADDR
第一个ADDR为.text段的地址,后面两个的顺序无关。
加载成功以后会有提示。然后我们就可以设置断点了。
break function
这样断点就设置完成了。我们将要在target机器上面执行。说以让gdb continue下去。
这个时候target机器就属于正常操作模式了。我们将要执行相应命令来是机器可以执行到function断点出,target机器就会被中断。我们可以在develop机器上面进行调试了。
后记:
gdb 调试模块感觉会出现一些很怪异的问题。就是代码不断来回跳转的情况。而不是一直向下走的情况,不过不影响调试。只是比较不爽而已。
可以参考我的另外一篇引用的代码,基本的char 模块代码。引用自the linux kernel module programming guaid.这是一本非常适合初学者的指导,可以参考。代码是经过了一定的修改,原文的代码实在2.6.10内核上面跑的。我的机器内核为2.6.32.且改为module_init(function); module_exit(function);更近进新内核模块的代码风格。
我将要做的是调试无线网卡驱动的模块。不过现在不知的在哪里设置断点。这个比较尴尬啊。