VS Code中开启GDB的pretty-printer功能

准备pretty-printer

pretty-printer是干什么的

众所周知,C++的STL容器的实现并不直观,直接使用gdb之类的debugger查看内存是需要周转多次才能看到具体的内容的。
在Visual Studio之类的IDE中内置了一些脚本,用来较为友好的显示容器内的元素。

GDB的pretty-printer脚本提供了类似的功能。

举个例子:
假设我们有如下c++代码

std::vector<int> vec{1,2,3,4};
std::string s="this is my string.";

在关闭和开启pretty-printer的情况下,我们使用GDB查看vec和s的时候看到的会是诸如下面这样的输出。在前面关闭prety-printer时,现实的是它们的具体实现中用到的成员变量,而开启之后显示的是具体的内容。

(gdb) disable pretty-printer
163 printers disabled
0 of 163 printers enabled
(gdb) p vec
$1 = {<std::_Vector_base<int, std::allocator<int> >> = {_M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x615c20, _M_finish = 0x615c30, _M_end_of_storage = 0x615c30}}, <No data fields>}
(gdb) p s
$2 = {static npos = 18446744073709551615, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x615c40 "this is my string."}, _M_string_length = 18, {_M_local_buf = "\022\000\000\000\000\000\000\000-\031@\000\000\000\000", _M_allocated_capacity = 18}}(gdb) enable pretty-printer
163 printers enabled
325 of 325 printers enabled
(gdb) p vec
$3 = std::vector of length 4, capacity 4 = {1, 2, 3, 4}
(gdb) p s
$4 = "this is my string."

安装pretty-printer

很遗憾虽然pretty-printer是GDB官方提供的,但是并没有默认安装/开启。所以需要手动安装。
需要注意的是,这个脚本是使用python开发的,所以需要7.0及以后的版本的GDB。

可以很方便的通过gcc官网下载 :
https://gcc.gnu.org/svn/gcc/trunk/libstdc+±v3/python/ 。
然后配置.gdbinit文件,开启它。

官网并没有自动打包,所以直接下载需要下载很多文件,推荐使用svn下载,或者解压我打包好的这个文件。
https://pan.baidu.com/s/11mWDYO60CsSNt8hcz66zOw

推荐将下载好的文件放在 ~/.gdb 目录下,如果没有可以自行创建。

# 使用svn下载的方法示例(前提是已经安装了svn)
mkdir ~/.gdb
cd ~/.gdb
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python stlprettyprinter

2021年10月更新:
GCC的代码管理模式从SVN更换到Git, 上面的那个链接和方式已经失效。
大家可以通过 https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libstdc%2B%2B-v3/python/libstdcxx;hb=HEAD 来访问并下载v6目录(随着gcc版本更新,这个目录名后续可能会变)下的printers.py脚本到你的~/.gdb目录(或其他你喜欢的地方)。


.gdbinit文件的配置也很简单(它要放在home目录下,如果没有配置过gdb那么很可能需要自己创建):
其中“/home/xxx/”为当前用户的home目录,假设脚本文件被放在了“/home/xxx/.gdb/stlprettyprinter/”。

python
import sys
sys.path.insert(0, '/home/xxx/.gdb/stlprettyprinter') # 按实际情况修改目录
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

配置成功之后,它就是默认开启的了,不需要再像我在演示中那样在GDB中使用enable/disable pretty-printer命令控制。

其他

早期的pretty-printer脚本不支持Python 3.0,但是现在已经没有这个问题了,无论你配置的默认python版本是什么,它都可以正常运行。
所以不要按照你在网上搜到的旧文章的指导去修改它。

在VS Code中自动开启pretty-printer

VS Code的Variables窗口默认显示的是内存映像,即使你的GDB已经开启了pretty-printer。

此时如果pretty-printer配置正常,在VS Code的debug console中输入-exec print vec命令是可以看到处理后的输出的。

在VS Code的debug console中输入-exec -enable-pretty-printing命令,可以临时开启pretty-printer,但是下次调试的时候需要重新输入。

使用VS Code的launch.json的setupCommands,可以自动执行这句指令。在MIMode同一级添加一个setupCommands。它可能是第一级的(和name在同一级),也可能是在特定平台的配置下(一般为linux下)。

"setupCommands": [{ "text": "-enable-pretty-printing", "description": "enable pretty printing", "ignoreFailures": true }]

注意:在VS Code中,这个配置的名字叫做pretty-printing,而不是pretty-printer。

Configuring launch.json for C/C++ debugging: https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md
一个相关的issue:
https://github.com/Microsoft/vscode-cpptools/issues/69

在VS Code中开启gdb的pretty-printer功能相关推荐

  1. 如何在PD虚拟机中开启系统的嵌套虚拟化功能?

    PD虚拟机是一款可以在Mac电脑中设置Windows系统的应用软件.在ParallelsDesktop虚拟机中如何开启系统的嵌套虚拟化功能?下面我们分享一下具体的操作步骤. 1.打开Mac电脑中Par ...

  2. 谷歌浏览器翻译本地的html,谷歌Chrome浏览器开启自带的翻译功能的方法

    谷歌浏览器是现在很多人喜欢用的浏览器,在使用时常常需要进行各种操作,平时使用浏览器浏览网页的时候,有时候想要将网页中的内容翻译,可以使用第三方插件,也可以使用浏览器自带的翻译功能,那么如何开启谷歌浏览 ...

  3. 赠书:全球首本VS Code中文书来了,高效编程秘诀全收录!

    自从Visual Studio Code第一个公开预览版本发布以来,这个轻量级的编辑器已经吸引了全球数以百万计的开发者.如今,Visual Studio Code已经有了超过1 200万的月活用户,并 ...

  4. 全宇宙首本 VS Code 中文书,来了!

    大家好!我是韩骏,VS Code 中文社区创始人,VS Code 的代码贡献者.2013 年,毕业于上海交通大学软件学院,现在是微软开发平台事业部的软件工程师.写过 20 多款 VS Code 插件, ...

  5. 如何在 VS Code 中编写、运行C语言程序 教程

    本篇目录 前言 1.下载.安装VS Code 2.安装VS code中2个插件 3.下载minGW64 4.配置系统的环境变量 5.C语言配置 6.编写一个测试程序 7.可能存在的问题 总结 前言 折 ...

  6. 如何在VS Code中运行C或C++程序

    前言 众所周知,VS Code源代码编辑器,是目前最为流行的代码开发工具之一,特别受到Web前端开发者的青睐,当然还有大名鼎鼎的HBuilder X也是非常给力的,我们可以根据自己的需要去选择. 由于 ...

  7. 为vs code中C++配置opencv4.5.4

    不想自己编译的,可以尝试直接使用别人编译好的,不过要注意将包含dll文件的目录添加进系统变量.这样在没有包含dll文件的路径下运行包含opencv的程序时,才不会报dll缺失. 单独编译链接,没有li ...

  8. 【AIGC使用教程】GitHub Copilot 免费注册及在 VS Code 中的安装使用

    欢迎关注[AIGC使用教程] 专栏 [AIGC使用教程]SciSpace 论文阅读神器 [AIGC使用教程]Microsoft Edge/Bing Chat 注册使用完全指南 [AIGC使用教程]Gi ...

  9. 如何在Visual Studio Code中编译C ++代码

    PS: This was published on my Blog here. PS:这已发布在我的Blog 此处 . C++ is a statically-typed, free-form, (u ...

最新文章

  1. 在ASP.NET 2.0中建立站点导航层次
  2. Class与Style绑定
  3. ASP.NET MVC应用程序实现下载功能
  4. oracle中delete、truncate、drop的区别 (转载)
  5. Acwing1069. 凸多边形的划分
  6. java jigsaw_Java 9和Project Jigsaw如何破坏您的代码
  7. videojs中文文档详解_你的项目需要一个高质量README文档!
  8. Linux设备模型(4)_sysfs
  9. 常见的三个网络协议的区别:TCP/IP、NetBEUI、IPX/SPX
  10. 新形势下电力监控系统网络安全风险分析与防护对策
  11. nodejs 安装环境配置以及解决‘node‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
  12. linux打开chm文件,安装kchmviewer,在linux下查看chm文件
  13. 爬虫基础知识+Scrapy框架
  14. iar 堆栈设置_IAR开发STM32堆栈设置
  15. 涉密计算机涉密存储设备或者改作其他用途的,将未经安全技术处理的退出使用的涉密计算机涉密存储设备或者改作其他用途的依法给予处分...
  16. 【JAVA基础速过】第3章 数组+Arrays工具类的使用
  17. smartsvn学习(-)
  18. 无插件使用Eclipse和Resin调试WEB应用(Debug Web App In Ecli...
  19. 在本地存储中存入和取出对象
  20. 干货丨如何准确找到剪辑点?后期剪辑进阶必看

热门文章

  1. NBUT1225 NEW RDSP MODE I(快速幂,规律)
  2. java 引用 引用的对象,Java 引用类型简述
  3. java,jsp页面添加提示图以及提示音乐
  4. 短视频查重机制及去重方法
  5. 管理学专业学生必懂 3月25日 16:40
  6. 非常受大学生欢迎的公众号
  7. 在 Mac 上通过“启动转换助理”安装 Windows 10
  8. Windows10记一次去掉桌面图标箭头引发的血案:该文件没有与之关联的应用来执行操作,请安装一个程序,若已安装程序,请在默认程序控制面板中创建关联。
  9. 起枪还是ECO ? CSGO什么时候起长枪 CSGO超实用教学
  10. diode示例1silvaco仿真流程