VIM 花招:格式化 gdb 打印的长变量输出

Posted 程序工匠坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VIM 花招:格式化 gdb 打印的长变量输出相关的知识,希望对你有一定的参考价值。

在 Linux 系统中用 gdb 调试(C系列语言)时,用 p 命令打印查看变量值很实用。

对于简单变量,打印显示很直观,如:

dgb) p i
$1 = 100

如果是复杂的结构体,或对象,输出格式会放在一对大括号 {} 中:

dgb) p object
$2 = {...}

如果对象足够大与足够复杂,这输出也可能是很长的一串,单行字符串在屏幕上被折成许 多行显示,内嵌结构也一堆大括号与逗号。可读性很差,不方便快速审查数据是否正确。 一个办法当然是通过取成员符号(点号)取部分成员打印。

另一个办法是将那大量输出复制出来,用外部工具格式化,以便统一查看整个对象。比如 通用的超强的编辑器 Vim。基本思路是在 {} 前后用全局替换打成不同行再用普通格式 命令 = 格式化,默认格式化方式为 cindent,即 C 语言的缩进方便。因为 gdb 的打 印输出也用大括号表示结构层次,笔者试过可行方便。

在将大串内容复制到 vim 后,具体步骤大概有以下几步,

" 在开大括号后加回车: %s/{\s*/{\r/g" 在逗号后加回车,分隔字段: %s/,/,\r/g" 在闭大括号前加回车: %s/}/\r}/g" 设置缩进宽度,按 = 缩进,根据 cindent 默认缩进方式: set sw=4: normal gg=G

最后一行表示在 vim 普通模式下,gg 回首行,按 = 后再按 G 扫描至尾行,即格 式化所有行了。也可以先定位到最外层的左大括号 { 或右大括号 },再按 =% ,% 表示光标跳转到匹配的大括号处。

格式化命令 = 很强大,不过它是基于行处理的,所以对于单行输出内容(如 gdb p 命 令),先用全局替换命令 :%s 打断成行。如果操作失误导致空行太多,可用以下命令 把空行再删去:

: g/^\s*$/delete

如果在查看浏览时,觉得短行太多,也可以顺手用 J 命令将一些行重新合并成一行。 在普通模式下是大写的 J,合并当前行与下一行,也可先选定几行再按 J 将所选行 都合并为一行。合并后会在行间保留一个空格,不管原来有多少缩进空白。在命令行模式 下也有 :j 命令,是 :join 的缩写。如 :1,$ j 会将所有行都再拼回一行。

最后,可以将上述几步操作保存在一个 vim 脚本中,以后再还用到的话不必再重复输入 这几个命令。比如保存在 ~/.vim/script/gdb_format.vim 文件中,以后还有相同需求 时只要用一个 source 命令即可:

: source ~/.vim/script/gdb_format.vim

最后,再提醒一句,如果经常需要检查 gdb 的大量输出,也不必每次手动复制。在 gdb 交互命令中可以打开日志,将之后的输出都保存到外部文件中。默认日志文件名是 gdb.txt, 当然也可以另外指定:

gdb)set logging on [filename]
<在这之间的 gdb 命令输出会记录至日志文件 >
gdb) set logging of

还可以在启动 gdb 时指定重定向,将本次会话的输出都记录在额外的文件中:

$ gdb | tee newfile


来源:https://github.com/lymslive

以上是关于VIM 花招:格式化 gdb 打印的长变量输出的主要内容,如果未能解决你的问题,请参考以下文章

如何 gdb 如何打印一个地址中的内容

Python 中如何打印变量值

可读格式的 GDB 打印变量(使用 << 运算符)

调试利器GDB(下)

每次进入gdb时都打印出局部变量

有没有一种方法可以在100到1000个索引的范围内打印长数组到GDB中的txt文件? (调试Fortran代码)