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模式。
转载于:https://blog.51cto.com/4989715/1420104