GDB的Pretty Printer功能

GDB的Pretty Printer功能

背景

做了多年的Windows平台开发,突然转到Linux开发,感觉非常的难受,我相信不仅仅是笔者,一般人都会觉得水土不服,毕竟Windows平台的Visual Studio实在是强大了,惯坏了大部分Windows开发人员。
因此选一个强大的IDE对初始阶段的Linux开发还是很有好处的,可以帮助我们平稳过度到Linux。索性,Visual Studio还有一个小兄弟VSCode,一个轻量级的IED,各种方便的功能由插件提供,极大的方便了我们的开发。在此,以C++语言为例,笔者分享一点心得。

Pretty Printer是什么

装完VSCode之后,我相信绝大部分人都会装C/C++插件:
image
然后我们就可以编写C/C++程序了,此插件会帮我们调用gdb来进行调试。因此C/C++插件在帮我们调试时,Pretty Printer功能的支持与否取决于GDB。

比如对于vector来说
开启Pretty Printer的调试效果如下:
image
不开启Pretty Printer的原始调试效果如下:
image

在调试过程中,两种显示方式各有千秋,Pretty Printer效果跟方便查看容器各个元素,而原始效果跟方便我们查看甚至修改容器的各个成员值。

而这两种效果,在Visual Studio里面,这两个效果直接结合在一起了,根本不需要额外配置。

如何开启Pretty Printer

写完代码,直接F5,VSCode会非常贴心的自动引导我们走一个生成launch.json文件,此时正常情况下,我们只需要修改pwd和program字段,即可开启Pretty Printer调试。launch.json里面开启Pretty Printer的字段如下所示:
image
如果安装了VSCode和C/C++插件,走完以上流程以后,你的调试并没有开启Pretty Printer,那么恭喜你,你中奖了。笔者虽然没有中奖,但是笔者当时为了追求VS2019的Pretty Printer+原始调试效果同时生效的效果,然后自己下载最新的GDB编译安装,然后就中奖了,无论有没有如上配置,都无法开启Pretty Printer功能。
为此,笔者甚至一度使用CodeLLDB插件,此插件的调试效果与VS系列很像,同时开启Pretty Printer和原始模式。但是后, 遇到一个问题,C以Release编译,B和APP以Debug的方式编译,APP依赖B,B依赖C,结果F11无法进入到B的源码,除非去B里面设置断点,但是GDB无此问题,笔者只是猜测是这个原因,但是目前还未解决,如果有遇到相同问题的,望与笔者分享,谢谢。
因此,笔者最终还是换回GDB。
言归正传,此时,我们如何开启Pretty Printer呢?
网上很多都说的不完整,因此,笔者在各位前辈的心血的基础上,结合自己的理解,总结了如下几个步骤:

  1. 首先,我们要明确一点,Pretty Printer其实是需要GDB在编译时开启Python功能的,我们可以命令行输入:gdb -config,输出如下:
    image
    好像至少在7.X版本以上的GDB,好像只需要开启python支持,launch.json配置好之后,就可直接开启Pretty Printer。

如果很不幸,依然没有开启Pretty Printer,那么可进行如下步骤。

  1. 我们注意到,上图最后面有关于gdbinit的配置,gdb在启动的时候,会先去解析这些配置。那么,我们接下来可以参考如下链接,笔者在此声明:他们的方法,笔者没用上。

如果按照以上步骤,还没有解决,目前笔者还没遇到,如果有的,可以交流一下。

  1. 在我们能够正常开启Pretty Printer以后,我相信绝大部分人都会一直开启,毕竟需要直接查看并修改容易里面各个成员的值得情况还是不如查看各个元素值得概率大。但是,如果我们确实需要,怎么办呢,我们可以临时开关Pretty Printer功能,方法如下:
  • 选择 调试控制台
  • 关闭时,输入:-exec disable pretty-printer
  • 开启是,输入:-exec enable pretty-printer
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值