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 打印的长变量输出的主要内容,如果未能解决你的问题,请参考以下文章