2.10 gdb 的升级版——cgdb
在使用gdb单步调试时,代码每执行一行才接着显示一行,很多用惯了图形界面IDE调试的朋友可能会觉得非常不方便,而gdbtui可能看起来不错,但是存在经常花屏的问题,也让很多人不胜其烦。那Linux下有没有既能在调试时动态显示当前调试处的文件代码又不花屏的工具呢?有的,这就是cgdb。
cgdb本质上是对gdb做了一层“包装”,因为所有在gdb中可以使用的命令,在cgdb中也可以使用。
# 2.10.1 安装 cgdb
cgdb的官网地址参见链接9。我们从官网得到最新包的下载链接后,执行
以下命令将 cgdb 压缩包下载到本地:
wget https://cgdb.me/files/cgdb-0.7.0.tar.gz
然后执行以下步骤解压、编译、安装:
tar -xvfz cgdb-0.7.0.tar.gz
cd cgdb-0.7.0
./configure
make
make install
2
3
4
5
cgdb在编译过程中会依赖一些第三方库,如果这些库系统上不存在,就会报错,安装一下就可以了。常见的错误及解决方案如下(这里以CentOS系统为例,使用yum安装方式,其他Linux版本都有对应的安装软件的命令,请读者自行查找):
出现错误:
configure: error: CGDB requires curses.h or ncurses/curses.h to build.
解决方案:
yum install ncurses-devel
出现错误:
configure: error: Please install makeinfo before installing
解决方案:
yum install texinfo
如果是CentOS 8.0及以上系统先要执行命令:
yum config-manager --set-enabled PowerTools
出现错误:
configure: error: Please install help2man
解决方案:
yum install help2man
出现错误:
configure: error: CGDB requires GNU readline 5.1 or greater to link.
If you used --with-readline instead of using the system readline library,
make sure to set the correct readline library on the linker search path
via LD_LIBRARY_PATH or some other facility.
2
3
4
解决方案:
yum install readline-devel
出现错误:
configure: error: Please install flex before installing
解决方案:
yum install flex
# 2.10.2 如何使用 cgdb
安装成功以后,在命令行输入命令cgdb
启动cgdb,启动后界面如下:
界面分为上下两部分:上部为代码窗口,显示调试过程中的代码;下部就是gdb原来的命令窗口。默认窗口焦点在下部的命令窗口,如果想将焦点切换到上部的代码窗口,按键盘上的【Esc】键,再次按键盘上字母【i】键焦点回到命令窗口。注意:这个“焦点窗口”的概念很重要,它决定着你当前可以操作的是上部的代码窗口还是下部的命令窗口(其实和gdbtui一样)。
我们以redis自带的客户端程序redis-cli为例,我们输入以下命令启动调试:
cgdb redis-cli
启动后的界面如下:
然后加两个断点。如下图所示:
如上图所示,我们在程序的main (上图中2824行)和2832行分别加了一个断点,添加断点以后,代码窗口的行号将会以红色显示,另外有一个绿色箭头指向当前执行的行(这里由于在main函数上加了个断点,绿色箭头指向第一个断点位置)。我们单步调试,并步入(step into)2827行的sdsnew函数调用中,可以看到我们的代码视图中相应的代码也发生了变化,并且绿色箭头始终指向当前执行的行数:
更多 cgdb 的用法可以参考官网文档,也可以参考链接10(网友写的 cgdb 中文手册)。
# 2.10.3 cgdb 的不足之处
cgdb虽然已经相比较原始的gdb和gdbtui模式在代码显示方面改进了许多,但是笔者在实际使用时发现,cgdb中调用gdb的print命令无法显示字符串类型中的中文字符,要么显示乱码,要么不显示,这有时候给程序调试带来了很大的困扰。这是需要注意的地方。
总体来说,cgdb仍然能满足我们大多数场景下的调试,瑕不掩瑜,与gdb相比,有了cgdb我们在Linux系统中调试程序就方便多了。