GDB TUI 界面调试

gdb调试一直是一个让人头疼的问题,我这个多年的linux用户也一直不习惯gdb,主要是因为gdb在调试的时候不能很好的展示源码。gdb里面可以用list命令显示源码,但是list显示没有代码高亮,我忍了,可是list这种显示代码的方式,使得我总不能一眼定位到正在执行的那行代码。

可以毫不夸张的说,这个问题是阻止我长期使用gdb的最大的障碍。这是如此的不便,以至于GNU都想办法解决了————使用gdb自带的gdbtui。
如果当前处于TUI模式,可以使用快捷键    Ctrl + X + A    离开TUI模式,如果处于非TUI模式,可以使用该快捷键进入TUI模式。
 

layout:用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:
layout src:显示源代码窗口
layout asm:显示汇编窗口
layout regs:显示源代码/汇编和寄存器窗口
layout split:显示源代码和汇编窗口
layout next:显示下一个layout
layout prev:显示上一个layout
Ctrl + L:刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。

 

-------------------------------------------------------------分割线-----------------------------------------------------------------------------------------------

 

很多 Linux 用户或者其他平台用户习惯了有强大的源码显示窗口的调试器,可能对 GDB 用 list 显示源码的方式非常不习惯,主要是因为 GDB 在调试的时候不能很好地展示源码。

GDB 中可以用 list 命令显示源码,但是 list 命令显示没有代码高亮,也不能一眼定位到正在执行的那行代码在整个代码中的位置。可以毫不夸张地说,这个问题是阻止很多人长期使用 GDB 的最大障碍,如此不便,以至于 GNU 都想办法解决了——使用 GDB 自带的 GDB TUI。

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

开启 GDB TUI 模式

开启 GDB TUI 模式有两个方法。

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

gdbtui -q 需要调试的程序名   【用gdb -tui可以进入】

方法二:直接使用 GDB 调试代码,在需要的时候使用切换键 Ctrl + X + A 调出 GDB TUI 。

GDB TUI 模式常用窗口

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

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

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

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.

另外,可以通过 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

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

窗口焦点切换

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

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

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

小结

GDB TUI 提供了一个可视化的代码阅读功能,比使用 list 命令来查看代码要方便不少,有兴趣的读者可以尝试一下。

=======================

直接上CGDB,那个才是神器!

 

参考及更多阅读:

https://www.cnblogs.com/loveyan1314/articles/10333015.html

http://www.cs.fsu.edu/~baker/ada/gnat/html/gdb_23.html

大型项目的调试是一个复杂的过程,而gdb是一个功能强大的调试器,可以帮助我们进行大型项目的调试。在使用gdb进行大型项目调试时,可以采取以下步骤: 1. 编译项目时添加调试选项(-g选项),以确保生成的可执行文件包含调试信息。 2. 使用gdb启动可执行文件。可以通过运行命令"gdb <可执行文件名>"来启动gdb。 3. 在gdb中设置断点。断点可以帮助我们在程序执行到指定位置时暂停执行,从而进行调试。可以使用命令"b <行号或函数名>"来设置断点。 4. 运行程序。在gdb中,可以使用"run"命令来运行程序。 5. 当程序执行到断点处时,gdb会自动暂停执行。此时,可以使用一系列gdb命令来观察程序状态,如查看变量值、打印堆栈信息等。 6. 使用gdb提供的调试命令来逐步执行程序。可以使用"next"命令逐行执行程序,使用"step"命令进入函数内部进行调试,使用"finish"命令跳出当前函数等。 7. 在调试过程中,可以使用gdb提供的其他命令来检查和修改程序状态,如"print"命令用于打印变量值,"set"命令用于修改变量值,"backtrace"命令用于打印堆栈信息等。 8. 根据调试过程中的观察和分析,找出问题的原因,并进行修复。可以使用gdb提供的命令来进行辅助调试,如"watch"命令用于监视变量的值变化,"break"命令用于设置临时断点等。 9. 调试完成后,可以使用"gdb"中的"quit"命令退出gdb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值