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.9 gdb tui——gdb图形化界面

    gdb调试有一个让很多人头疼的问题,很多Linux用户或者从其他平台转过来习惯了有强大的源码显示窗口的调试器可能对gdb用list命令显示源码的方式非常不习惯,主要是因为gdb在调试的时候不能很好的展示源码。gdb里面可以用list命令显示源码,但是list命令显示没有代码高亮,也不能一眼定位到正在执行的那行代码在整个代码中的位置。可以毫不夸张的说,这个问题是阻止很多人长期使用gdb的最大的障碍。如此的不便,以至于GNU都想办法解决了——使用gdb自带的gdbtui。

    先来看一张效果图,是我在使用gdbtui调试redis-server时的截图,这样看代码比使用list命令方便多了吧。

    下面介绍gdbtui 。

    # 2.9.1 开启gdb TUI模式

    方法一:使用gdbtui或者gdb-tui开启一个调试。

    gdbtui -q 需要调试的程序名
    
    1

    方法二:直接使用gdb调试代码,在需要的时候使用切换键Ctrl + x + a调出gdbtui。

    # 2.9.2 gdb TUI模式下有4个窗口

    默认情况下,gdbtui模式下会显示command窗口和source窗口,如上图所示。TUI模式下还有其他窗口,如下面列举的四个常用的:

    • (cmd) command命令窗口,可以键入调试命令。
    • (src) source源代码窗口, 显示当前行、断点等信息。
    • (asm) assembly汇编代码窗口。
    • (reg) register寄存器窗口。

    可以通过layout + 窗口类型命令来进行选择自己需要的窗口,例如在cmd窗口输入layout asm则可以切换到汇编代码窗口。

    gdbtui切换到汇编窗口

    layout命令还可以用来修改窗口布局,可以在cmd窗口中输入help layout,常见的有:

    Usage: layout prev | next | <layout_name> 
    Layout names are:
       src   : Displays source and command windows.
       asm   : Displays disassembly and command windows.
       split : Displays source, disassembly and command windows.
       regs  : Displays register window. If existing layout
               is source/command or assembly/command, the 
               register window is displayed. If the
               source/assembly/command (split) is displayed, 
               the register window is displayed with 
               the window that has current logical focus.
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    另外,可以通过winheight命令修改各个窗口的大小。如下所示:

    (gdb) help winheight
    Set the height of a specified window.
    Usage: winheight <win_name> [+ | -] <#lines>
    Window names are:
    src  : the source window
    cmd  : the command window
    asm  : the disassembly window
    regs : the register display
    
    ##将代码窗口的高度扩大5行代码
    winheight src + 5
    ##将代码窗口的高度减小4代码
    winheight src - 4
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    # 2.9.3 解决tui窗口不自动更新内容的问题——space命令

    当前gdb tui窗口放大或者缩小以后,gdbtui窗口中的内容不会自己刷新以适应新的窗口尺寸,我们可以通过space键强行让gdbtui窗口刷新。

    # 2.9.4 窗口焦点切换

    在默认设置下,方向键和PageUp/PageDown都是用来控制gdbtui的src窗口的,所以,我们常用的上下键用来显示前一条命令和后一条命令的功能就没有了,不过这个时候我们可以通过Ctrl + n/ctrl + p来获取这个功能。

    注意:当我们通过方向键调整了gdbtui的src窗口以后,可以通过update命令重新把焦点定位到当前执行的代码上。

    我们可以通过focus命令来调整焦点位置,默认情况下是在src窗口,通过focus next命令, 焦点就移到cmd窗口了,这时候就可以像以前一样,通过方向键来切换到上一条命令和下一条命令。同理,也可以使用focus prev切回到src窗口。如果焦点不在src窗口上,我们就不能通过方向键来浏览源码了。

    (gdb) help focus  
    help focus
    Set focus to named window or next/prev window.
    Usage: focus {<win> | next | prev}
    Valid Window names are:
    src  : the source window
    asm  : the disassembly window
    regs : the register display
    cmd  : the command window
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    上次更新: 2025/05/19, 16:52:22
    2.8 gdb实用调试技巧
    2.10 gdb 的升级版——cgdb

    ← 2.8 gdb实用调试技巧 2.10 gdb 的升级版——cgdb→

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