本系列专题,旨在介绍一些非常实用,却不为大多数人所知的调试技巧。灵活运用这些调试技巧,能够轻松解决一些我们经常遇到并为之困惑的问题,大大提高程序调试的效率。
感兴趣的朋友,欢迎右上角关注!
引言 - 程序调试的痛
关于程序调试,有人喜欢各种调试工具,有人喜欢用简单直接的log打印。两种方法各有各的优势和不足,大多时候是可以互补的。
在Linux环境下,GDB是各种调试工具中的佼佼者,而printf则是各种日志打印方法中的典型代表。
![6d9ec7f6991e06daff071c0ef9bb904f.png](https://img-blog.csdnimg.cn/img_convert/6d9ec7f6991e06daff071c0ef9bb904f.png)
调试问题时候,你遇到过下面的情况吗?
代码添加打印信息进行调试,突然发现添加打印的位置不对,或者别的地方也需要添加打印信息。
于是,重新修改源码,重新添加打印,重新编译,重新部署,重新运行,重新调试,重新分析。
当我们费了九牛二虎之力把这些都弄好之后,很不幸地又发现了新的问题,然后不得不反复进行这些过程。
而且,当问题定位出来之后,我们之前花费很大力气添加的调试信息,还必须从程序中删除掉。
![52ac227e4615f4401772ec5b327805fa.png](https://img-blog.csdnimg.cn/img_convert/52ac227e4615f4401772ec5b327805fa.png)
对于简单的程序,这些尚可接受。但是,在大型项目中,单是编译构建过程可能就要几十分钟,甚至数个小时,而部署过程则更为复杂。
你能想象得出,在这样的项目中一直重复这些过程,是一件多么痛苦的事情吗?
那么,有没有一种方法,既不需要修改源码,又能随时在程序中任何地方任意添加打印信息呢?
当然有!GDB的动态打印功能正式为此而生的!
![37d4f9742e2fdec0e86645507de680fa.png](https://img-blog.csdnimg.cn/img_convert/37d4f9742e2fdec0e86645507de680fa.png)
GDB Dynamic Printf
GDB提供了Dynamic Printf功能,下文我们称之为动态打印。利用这个功能,我们可以在不修改程序源码的情况下,随时在程序的任何地方添加格式化打印