1、kdb绑定串口的方式有两种:

在运行时:

echo ttyS0,115200 >/sys/module/kgdboc/parameters/kgdboc

kgdb:Registered I/O driver kgdboc

在内核启动时:

加入启动参数:kgdboc=ttyS0,115200 kgdbwait

通过这两种方式,相当于给kdb安装了串口IO驱动。

如果想让内核在启动的过程中直接挂起,那么可以再启动参数中加入kgdbwait。

在这里我简单总结一下原理:

内核启动参数通过__setup以及early_param都注册了自己的回调函数,而且放到了内核中的指定位置。当内核在启动的时候,会调用do_initcalls函数,一一执行这些函数,一次,内核启动参数的相关代码会被执行。在上面我们注册的两个回调函数中,kgdboc=ttyS0,115200相当于对串口进行设置。那在内核初始化的过程中,就会执行串口模块的初始化函数init_kgdboc,该函数就会根据传递的内核参数对串口驱动进行相应的初始化。而此时正好设置了kgdbwait,它的回调函数仅仅是对一个变量赋值,在串口驱动初始化程序中,当串口驱动注册完了之后,会检测该变量的值,如果被赋值,那么就会执行kgdb_breakpoint,插入断点,这样kgdb就获取了控制权。 

2、kdb配置为键盘模式:

在内核参数进行设置

kgdboc=kbd

在运行时:

echo kdb >/sys/module/kgdboc/parameters/kgdboc

3、同时配置为串口模式和键盘模式

在内核参数进行设置:

kgdboc=kdb,ttyS0,115200

在运行时

echo kdb,ttyS0,115200 >/sys/module/kgdboc/parameters/kgdboc

4、激活kdb(前提条件是系统已经给kdb配置好了IO串口)

使用魔术键‘g’进入debugger。

在内核panic的时候也会主动进入kdb。

可以设置断点进入kdb:首先用魔术键进入kdb,然后设置断点,

最后执行‘go’命令。当断点命中时,系统会进入kdb模式。