![C++服务器开发精髓](https://wfqqreader-1252317822.image.myqcloud.com/cover/623/39479623/b_39479623.jpg)
2.10 gdb的升级版——cgdb
在使用gdb单步调试时,代码每执行一行才接着显示一行,很多用惯了图形界面IDE调试的朋友可能会觉得非常不方便,而 gdbtui 可能看起来不错,但是存在经常花屏的问题,让很多人不胜其烦。那么在Linux下有没有既能在调试时动态显示当前调试处的文件代码又不花屏的工具呢?有,它就是cgdb。
cgdb 在本质上是对 gdb 做了一层“包装”,在 gdb 中可以使用的所有命令,在 cgdb中也可以使用。
从cgdb官网下载最新版的cgdb,执行以下命令将cgdb压缩包下载到本地:
![](https://epubservercos.yuewen.com/EE4394/20637464301305906/epubprivate/OEBPS/Images/41263_168_3.jpg?sign=1738865260-4nSBT3BOvFvwR8ZMwXvVtixv3fPRKgP8-0-025847684fd18ae42dc0fe3bbf025581)
然后进行解压缩、编译、安装:
![](https://epubservercos.yuewen.com/EE4394/20637464301305906/epubprivate/OEBPS/Images/41263_168_4.jpg?sign=1738865260-FzgjHB2hXnAXUfX6AVhoCrD41aidQyEg-0-990631a914c19c665726e46fa9974530)
cgdb在编译过程中会依赖一些第三方库,如果这些库在系统中不存在,就会报错,对其进行安装就可以了。
安装cgdb成功以后,在命令行中输入命令cgdb启动cgdb,启动后的界面如下图所示。
![](https://epubservercos.yuewen.com/EE4394/20637464301305906/epubprivate/OEBPS/Images/41263_168_5.jpg?sign=1738865260-DIX3QiD1n8zFMXfUcdv7GHfEqf9YpQvM-0-37a428b32f1fb5cd02b31ff2552dc148)
界面分为上下两部分:上半部分为代码窗口,显示处于调试过程中的代码;下半部分显示gdb原来的命令窗口。默认的窗口焦点在命令窗口中,如果想将窗口焦点切换到代码窗口,则按键盘上的 Esc 键,再次按键盘上的字母 i 键即可。注意:“窗口焦点”的概念很重要,它决定着我们当前可以操作的是代码窗口还是命令窗口(其实和 gdbtui一样)。
以Redis自带的客户端程序redis-cli为例,输入以下命令启动调试:
![](https://epubservercos.yuewen.com/EE4394/20637464301305906/epubprivate/OEBPS/Images/41263_169_1.jpg?sign=1738865260-fqRRU2zmCKErb9JwmHLgxR9ZGV6eqNRP-0-3bcc4f09854b3cc028c61f594bd5dd5e)
启动后的界面如下图所示。
![](https://epubservercos.yuewen.com/EE4394/20637464301305906/epubprivate/OEBPS/Images/41263_169_2.jpg?sign=1738865260-E56rZsVsJlkXqCAYxu5IpQYfw0GHBalo-0-810e181bf81a9ae1bc75a755902e0cb3)
然后加两个断点,如下图所示。
![](https://epubservercos.yuewen.com/EE4394/20637464301305906/epubprivate/OEBPS/Images/41263_170_1.jpg?sign=1738865260-Xbpmeanjpzc1gRLyLYxtzKV1iOMgJ8G7-0-97e033ce81367422ae977579cfe0e0ae)
如上图所示,我们在程序的 main(第 7922 行)和第 7934 行分别加了一个断点,添加断点以后,断点未触发前,代码视图中断点处的行号将以深色显示,另有一个箭头指向当前执行的行。我们调试时,可以看到代码视图中相应的代码也发生了变化,并且箭头始终指向当前执行的行数,如下图所示。
cgdb虽然已经比原始的gdb和gdbtui模式在代码显示方面改进许多,但在cgdb中调用gdb的print命令无法显示字符串类型的中文字符,要么显示乱码,要么不显示,这给程序调试带来了很大的困扰。
![](https://epubservercos.yuewen.com/EE4394/20637464301305906/epubprivate/OEBPS/Images/41263_171_1.jpg?sign=1738865260-c0H8wpyNYZlQ6R0lziVKyQ1y1AzAEWfy-0-577c8c1e689c87accc2c66ff5bb63ce7)
总体来说,cgdb仍然能满足我们大多数场景下的调试需求,与gdb相比,有了cgdb,我们在Linux系统中调试程序就方便多了。