gdb配置打印STL容器脚本pretty printer

x33g5p2x  于2021-10-31 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(157)

使用 gdb 调试是 Linux 下 C/C++ 开发不可少的工具,但是对于大型项目,调试需要有更高的效率,虽然 gdb 原生支持配置文件中自定义打印函数,可以自行定制这些函数。网上也有一些针对 STL 标准容器的 .gdbinit 文件,该文件会定义string、vector、map、set、deque、priority_queue 等,可以参考这里。把该文件保存 为 .gdbinit, 放在用户目录下~/.gdbinit,当执行 gdb 调试时会自动加载 .gdbinit 初始文件。

使用该配置文件时,打印 vextor 就比较简单了,比如:

pvector v        #打印所有内容
pvector v 0      #打印位置为0的内容
pvector v 1 2    #打印[1, 2]的内容

配置 pretty printer

上述的配置无法支持 unordered_map 等 C++11 新增的容器,除非配置自定义新的打印函数。

最好的办法是通过配置 来解决,默认安装 gcc 高版本 (>4.6.0) 情况下会自带 pretty printer,可以通过 svn 来下载最新版本:svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc+±v3/python。git 地址是:https://github.com/gcc-mirror/gcc.git

pretty printer 也支持用户的自定制,具体例子可以参考这里,实现变量具体打印类,已经 gdb 类型名字到打印类的映射。

使用方式:

先从上面的链接下载 python 脚本,这个脚本在 gdb 高版本是自带的(gcc10.2 自带的目录在 /usr/share/gcc/python),不过这里我们统一下载下。最好放到一个容易辨识的文件夹里,这里取名字 stl_pretty_printer。

mkdir stl_pretty_printer
cd stl_pretty_printer
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

.gbdinit 是 gdb 的配置文件,在启动的时候加载,我们需要将以下内容复制到其中。

下面给出 .gdbinit 中 pretty printer 配置内容:

set print pretty on
set print object on
set print static-members on
set vtbl on
set print demangle on
set demangle on
set print sevenbit-strings off

python
import sys
sys.path.insert(0, '/xxx/xxx/stl_pretty_printer/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

其中需要在自己目录下找到 python 下 libstdcxx 对应的路径,填写在 sys.path.insert 变量里。

如果不想使用pretty printer 打印, 可以添加 /r 参数就是原生打印。

p /r xxx

注意,如果使用 gdb 版本很高(当前最新 gdb 版本为10.2.0),生成调试程序可能需要带 -gdwarf-3 参数,只有使用该参数,pretty printer 才能生效,调试信息兼容到高版本。

更具体的解释是:gcc 版本大于 4.8,缺省生成 dwarf4 版本的调试信息,pretty printer 基于 dwarf3 版本,因此 gdb 中 pretty printer 可能无法识别相应类型符号,需要通过选项 -gdwarf-3 来生成低版本调试信息。

一个简单编译例子:

g++ -g -gdwarf-3 -O0 -o test test.cpp

注意事项

如果执行了以上操作发现不起作用,或者在启动 gdb 时候提示“不支持 python 的脚本”,需要检查在安装 gdb 时候是否启用了 python 支持。

如果没有启用,需要重新安装,参见这篇博客 https://blog.csdn.net/wj1066/article/details/83653153 ,只是在 configure 的时候使用如下参数。

./configure --with-python

如果在 make 的时候提示 Python missing or unusable error while cross compiling GDB,请切换到系统默认 python 或者安装 python-dev。

对于 pretty printer 的更多使用文档,还需要参考上面给的官方文档,在配置了文件后,可以直接打印出容器中的值,非常方便查看,对于程序调试的效率也高很多。

原文链接:https://blog.csdn.net/matrix_zzl/article/details/78578091

相关文章

微信公众号

最新文章

更多