我们在用gdb进行c语言调试时,为了查看源程序,了解程序执行位置,一般都会用tui模式,即:
gdb -tui xxxxxx
在tui模式下,用户界面分为上下两个窗口,上面为src窗口,下面为cmd窗口。缺省焦点在src窗口,方向键可以控制源代码的滚动。
可以用focus命令控制焦点位置:
focus cmd 命令将焦点切换到cmd窗口
focus src命令将焦点切换到源代码窗口
焦点切换到cmd窗口后,可以使用方向键回滚命令输入和进行命令编辑。
但无论焦点在那个窗口,tui模式下是没有复制粘贴功能的。这时如果需要查看变量需要手工敲完整的变量名,当c语言定义了比较复杂的结构时,需要了解结构中那些动态分配内存的变量情况就变得很麻烦。不过我们知道,Linux下命令行终端是有复制粘贴能力的,如果我们使用命令行终端本身的复制粘贴功能,就可以从别的编辑窗口拷贝复杂的结构了。
为了使用命令行终端的复制粘贴功能,我们可以使用gdb提供的快捷键ctl+x+a退出tui模式,待查看完变量后再用同样的快捷键返回tui模式即可。这样可以免去手工敲击大量字符之苦。
另外,gdb还有一个非常实用的命令update,当你在src窗口使用上下键翻看源代码后,想要回到当前正在执行的那行代码,可以使用这个命令。
如果程序调试过程中有打印输出,会破坏窗口的整体形状,这是可以使用ctrl+l来恢复窗口的整洁状态。
另附:gdb多线程调试相关命令
info threads 查看当前所有可以调试的线程
thread xx 切换到xx线程,xx为info thread 命令看到的第一列id
set scheduler-locking on 只运行当前线程
set scheduler-locking off 运行所有线程
thread apply xx n 命令线程xx执行n命令
thread apply xx b perfthread.c:196 设置线程断点到perfthread.c文件的196行