CppGuide社区 CppGuide社区
首页
  • 最新谷歌C++风格指南(含C++17/20)
  • C++17详解
  • C++20完全指南
  • C++23快速入门
  • C++语言面试问题集锦
  • 🔥C/C++后端开发常见面试题解析 (opens new window)
  • 网络编程面试题 (opens new window)
  • 网络编程面试题 答案详解 (opens new window)
  • 聊聊WebServer作面试项目那些事儿 (opens new window)
  • 字节跳动面试官现身说 (opens new window)
  • 技术简历指南 (opens new window)
  • 🔥交易系统开发岗位求职与面试指南 (opens new window)
  • 第1章 高频C++11重难点知识解析
  • 第2章 Linux GDB高级调试指南
  • 第3章 C++多线程编程从入门到进阶
  • 第4章 C++网络编程重难点解析
  • 第5章 网络通信故障排查常用命令
  • 第6章 高性能网络通信协议设计精要
  • 第7章 高性能服务结构设计
  • 第8章 Redis网络通信模块源码分析
  • 第9章 后端服务重要模块设计探索
  • 🚀 全部章节.pdf 下载 (opens new window)
  • 源码分析系列

    • leveldb源码分析
    • libevent源码分析
    • Memcached源码分析
    • TeamTalk源码分析
    • 优质源码分享 (opens new window)
    • 🔥远程控制软件gh0st源码分析
  • 从零手写C++项目系列

    • C++游戏编程入门(零基础学C++)
    • 🔥使用C++17从零开发一个调试器 (opens new window)
    • 🔥使用C++20从零构建一个完整的低延迟交易系统 (opens new window)
    • 🔥使用C++从零写一个C语言编译器 (opens new window)
    • 从零用C语言写一个Redis
  • Windows 10系统编程
  • Go语言特性

    • Go开发实用指南
    • Go系统接口编程
    • 高效Go并发编程
    • Go性能调优
    • Go项目架构设计
  • Go项目实战

    • 使用Go从零开发一个数据库
    • 🔥使用Go从零开发一个编译器 (opens new window)
    • 🔥使用Go从零开发一个解释器 (opens new window)
    • 🔥用Go从零写一个编排器(类Kubernetes) (opens new window)
  • Rust编程

    • Rust编程指南
  • 数据库

    • SQL零基础指南
    • MySQL开发与调试指南
  • Linux内核

    • 心中的内核 —— 在阅读内核代码之前先理解内核
    • 🔥Linux 5.x内核开发与调试 完全指南 (opens new window)
    • TCP源码实现超详细注释版.pdf (opens new window)
GitHub (opens new window)
首页
  • 最新谷歌C++风格指南(含C++17/20)
  • C++17详解
  • C++20完全指南
  • C++23快速入门
  • C++语言面试问题集锦
  • 🔥C/C++后端开发常见面试题解析 (opens new window)
  • 网络编程面试题 (opens new window)
  • 网络编程面试题 答案详解 (opens new window)
  • 聊聊WebServer作面试项目那些事儿 (opens new window)
  • 字节跳动面试官现身说 (opens new window)
  • 技术简历指南 (opens new window)
  • 🔥交易系统开发岗位求职与面试指南 (opens new window)
  • 第1章 高频C++11重难点知识解析
  • 第2章 Linux GDB高级调试指南
  • 第3章 C++多线程编程从入门到进阶
  • 第4章 C++网络编程重难点解析
  • 第5章 网络通信故障排查常用命令
  • 第6章 高性能网络通信协议设计精要
  • 第7章 高性能服务结构设计
  • 第8章 Redis网络通信模块源码分析
  • 第9章 后端服务重要模块设计探索
  • 🚀 全部章节.pdf 下载 (opens new window)
  • 源码分析系列

    • leveldb源码分析
    • libevent源码分析
    • Memcached源码分析
    • TeamTalk源码分析
    • 优质源码分享 (opens new window)
    • 🔥远程控制软件gh0st源码分析
  • 从零手写C++项目系列

    • C++游戏编程入门(零基础学C++)
    • 🔥使用C++17从零开发一个调试器 (opens new window)
    • 🔥使用C++20从零构建一个完整的低延迟交易系统 (opens new window)
    • 🔥使用C++从零写一个C语言编译器 (opens new window)
    • 从零用C语言写一个Redis
  • Windows 10系统编程
  • Go语言特性

    • Go开发实用指南
    • Go系统接口编程
    • 高效Go并发编程
    • Go性能调优
    • Go项目架构设计
  • Go项目实战

    • 使用Go从零开发一个数据库
    • 🔥使用Go从零开发一个编译器 (opens new window)
    • 🔥使用Go从零开发一个解释器 (opens new window)
    • 🔥用Go从零写一个编排器(类Kubernetes) (opens new window)
  • Rust编程

    • Rust编程指南
  • 数据库

    • SQL零基础指南
    • MySQL开发与调试指南
  • Linux内核

    • 心中的内核 —— 在阅读内核代码之前先理解内核
    • 🔥Linux 5.x内核开发与调试 完全指南 (opens new window)
    • TCP源码实现超详细注释版.pdf (opens new window)
GitHub (opens new window)
  • 第1章高频C++11重难点知识解析

  • 第2章Linux GDB高级调试指南

    • 2.1 SSH 工具与 FTP 工具
    • 2.2 Makefile 与 cmake
    • 2.3 使用Visual Studio管理和阅读开源项目代码
    • 2.4 gdb 调试准备
    • 2.5 gdb常用命令详解——利用gdb调试redis
    • 2.6 使用gdb调试多线程程序
    • 2.7 使用gdb调试多进程程序——以调试nginx为例
    • 2.8 gdb实用调试技巧
    • 2.9 gdb tui——gdb图形化界面
    • 2.10 gdb 的升级版——cgdb
      • 2.11 使用VisualGDB调试
      • 2.12 本章总结与扩展阅读
    • 第3章C++多线程编程从入门到进阶

    • 第4章C++网络编程重难点解析

    • 第5章网络通信故障排查常用命令

    • 第6章高性能网络通信协议设计精要

    • 第7章高性能服务结构设计

    • 第8章Redis 网络通信模块源码分析

    • 第9章后端服务重要模块设计探索

    • C++后端开发进阶
    • 第2章Linux GDB高级调试指南
    zhangxf
    2023-04-05
    目录

    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
    
    1

    然后执行以下步骤解压、编译、安装:

    tar -xvfz cgdb-0.7.0.tar.gz
    cd cgdb-0.7.0
    ./configure 
    make
    make install
    
    1
    2
    3
    4
    5

    cgdb在编译过程中会依赖一些第三方库,如果这些库系统上不存在,就会报错,安装一下就可以了。常见的错误及解决方案如下(这里以CentOS系统为例,使用yum安装方式,其他Linux版本都有对应的安装软件的命令,请读者自行查找):

    出现错误:

    configure: error: CGDB requires curses.h or ncurses/curses.h to build.
    
    1

    解决方案:

    yum install ncurses-devel
    
    1

    出现错误:

    configure: error: Please install makeinfo before installing
    
    1

    解决方案:

    yum install texinfo
    
    1

    如果是CentOS 8.0及以上系统先要执行命令:

    yum config-manager --set-enabled PowerTools
    
    1

    出现错误:

    configure: error: Please install help2man
    
    1

    解决方案:

    yum install help2man
    
    1

    出现错误:

    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.
    
    1
    2
    3
    4

    解决方案:

    yum install readline-devel
    
    1

    出现错误:

    configure: error: Please install flex before installing
    
    1

    解决方案:

    yum install flex
    
    1

    # 2.10.2 如何使用 cgdb

    安装成功以后,在命令行输入命令cgdb启动cgdb,启动后界面如下:

    界面分为上下两部分:上部为代码窗口,显示调试过程中的代码;下部就是gdb原来的命令窗口。默认窗口焦点在下部的命令窗口,如果想将焦点切换到上部的代码窗口,按键盘上的【Esc】键,再次按键盘上字母【i】键焦点回到命令窗口。注意:这个“焦点窗口”的概念很重要,它决定着你当前可以操作的是上部的代码窗口还是下部的命令窗口(其实和gdbtui一样)。

    我们以redis自带的客户端程序redis-cli为例,我们输入以下命令启动调试:

    cgdb redis-cli
    
    1

    启动后的界面如下:

    然后加两个断点。如下图所示:

    如上图所示,我们在程序的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系统中调试程序就方便多了。

    上次更新: 2025/05/19, 16:52:22
    2.9 gdb tui——gdb图形化界面
    2.11 使用VisualGDB调试

    ← 2.9 gdb tui——gdb图形化界面 2.11 使用VisualGDB调试→

    最近更新
    01
    第二章 关键字static及其不同用法
    03-27
    02
    第一章 auto与类型推导
    03-27
    03
    第四章 Lambda函数
    03-27
    更多文章>
    Copyright © 2024-2025 沪ICP备2023015129号 张小方 版权所有
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式