Linux内核调试工具KGDB?

Linux内核调试工具KGDB?,第1张

内核工具KGDB调试环境需要为Linux 内核加上 kgdb补丁,补丁实现GDB远程调试所需要的功能,包括命令处理、陷阱处理及串口通信3个主要的部分。KGDB补丁的主要作用是在Linux 内核中添加了一个调试Stub。调试Stub是Linux 内核中的一小段代码,是运行GDB的开发机和所调试内核之间的一个媒介。GDB和调试stub之间通过GDB串行协议进行通信。GDB串行协议是-种基于消息的ASCII 码协议,包含了各种调试命令。当设置断点时,KGDB将断点的指令替换为一条 trap指令,当执行到断点时控制权就转移到调试 stub中去。此时,调试stub 的任务就是使用远程串行通信协议将当前环境传送给GDB,然后从GDB处接收命令。GDB命令告诉stub 下一步该做什么,当stub收到继续执行的命令时,将恢复程序的运行环境,把对 CPU的控制权重新交还给内核。KGDB补丁给内核添加以下3个部件:

(1 ) GDB stub

GDB stub被称为调试插桩(简称为stub),是KGDB调试器的核心。它是Linux内核中的一小段代码,用来处理主机上: GDB发来的各种请求并且在内核处于被调试状态时,控制目标机板上的处理器。

(2)修改异常处理函数

当这个异常发生时,内核将控制权交给KGDB调试器,程序进入KGDB提供的异常处理函数中。在里面,可以分析程序的各种情况。

(3)串口通信

GDB和 stub之间通过GDB串行协议进行通信。它是一种基于消息的ASCII 码协议,包含了各种调试命令。除串口外,也可以使用网卡进行通信。以设置内核断点为例说明KGDB与GDB之间的工作过程。设置断点时,KGDB修改内核代码,将断点位置的指令替换成一条异常指令(在ARM中这是一条未定义的指令)。当执行到断点时发生异常,控制权转移到stub 的异常处理函数中。此时,stub的任务就是使用GDB串行通信协议将当前环境传送给GDB,然后从GDB处接收命令,GDB命令告诉stub下一步该做什么。当stub收到继续执行的命令时,将恢复原来替换的指令、恢复程序的运行环境,把对CPU的控制权重新交还给内核。

Linux调试程序大多数都是喜欢用gdb,gdb是一个命令行界面的程序调试工具,任何调试 *** 作都是输入命令来实现的。从Windows过来的程序员可能不习惯用gdb这个调试器,可以去试试一些图形界面的的调试器,比如Kgdb、Affinic GUI Debugger,这两款调试器虽然是图形界面的调试器,但是它其实是调用gdb来完成它的调试功能的,也就是说它们其实是gdb的一个图形界面的外壳,所以要先安装好gdb再安装它们,不习惯gdb的命令界面的话,可以试试这两款软件。

安装完成后,请不要着急打开软件。需先进行配置。具体步骤如下:

查看串口设备及文件权限

linux下的所有 *** 作面向用户的都是文件 *** 作,在对串口 *** 作之前,我们应该先确认自己对该文件有没有读写权限。

linux下的usb串口命名为ttyUSB*,运行上面命令,可以看到有几个设备挂载。

我们这里是:

只有ttuUSB0.再用lsusb查看:

usb 004正是我们挂上去的usb转串口线缆,使用的芯片是PL2303。

但是正如上面显示,ttyUSB0这个设备是root所有的,所以,我们以普通用户身份打开minicom是没法访问该文件的。

运行sudo minicom -s便进入了minicom的配置界面,使用上下键选择Serial port setup,回车。此时光标在“change which setting”后面停留,它的上面有如下菜单:

我们只需输入上面对应的字母,就可以进如相应的菜单进行设置。设置完成,回车,光标会回到“change which setting”后面,如此重复。完成按回车返回主菜单即可。

返回主菜单后,选择“Save setup as df1”,将其保存为默认设置,然后选择 Exit退出。需退出后重新打开minicom,软件才会使用上述参数进行初始化。

注意:如果没有使用USB转串口,而是直接使用串口,那么Serial Device要配置为/dev/ttyS0。

如果上面设置顺利,打开minicom

重新给设备上电后,此时,窗口里就有信息打印出来了。

1)需使用Ctrl+a 进入设置状态

2)按z进入设置菜单

(1)O键:打开配置选项;

(2)W键:自动卷屏。当显示的内容超过一行之後,自动将後面的内容换行。这个功能在查看内核的启动信息时很有用。

(3)C键:清除屏幕的显示内容;

(4)B键:浏览minicom的历史显示;

(5)X键:退出minicom,会提示确认退出。

Ctrl + A -->O

选择"Filenames and paths"

更多的参数,参见"man minicom"的输出。

如果不加这个项,那么在minicom和pc交互的时候中键入命令超过一行时候会被截断,(这时候可以通过 <C-a>w 来开和关切换截断行功能).

这样,启动之后我们会发现显示的内容不是黑白的了。

这样,启动之后,所在minicom的输出都会在<filename>中保留一份,如果原来文件存在,则追加,不存在则创建一个。

这样,我们可以取代用 <C-a>* 发送命令的方式,将 <C-a>替换成 [Alt] 或者 [ESC] .

这里,<filename>是你的脚本文件的名字,应该指定绝对路径,否则就会在你启动minicom的路径下寻找。

Minicom是基于窗口的。要d出所需功能的窗口,可按下 Ctrl-A (以下使用C-A来表示Ctrl-A),然后再按各功能键(a-z或A-Z)。先按C-A,再按'z',将出现一个帮助窗口,提供了所有命令的简述。配置 minicom(-s 选项,或者C-A、O)时,可以改变这个转义键,不过现在我们还是用Ctrl-A吧。

这里,只给出很少的命令,更多的交互命令参见"<C-a>z"的帮助输出。

minicom -s 或启动minicom之后运行 <C-a>o 来进行配置。

C:脚本文件的存放位置: <C-a>g 运行脚本时的路径 。

D:选择脚本程序: 默认 runscript ,也可以选择 bash 脚本格式。

可以参考man手册 man runscript .交互命令中可以运行" <C-a>G "来运行脚本。

参考资料


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8915449.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-22
下一篇 2023-04-22

发表评论

登录后才能评论

评论列表(0条)

保存