本系列专题,旨在讲解一些非常实用,却鲜为人知的高阶调试技巧,以及调试器的实现原理,和常见问题的定位方法和思路。
感兴趣的朋友,欢迎右上角关注!
引言 - 调试引入的不确定性
在调试代码或者定位问题的时候,大家有没有遇到过下面这两种情况:
- 一个100%必现的代码BUG,在单步跟踪或者使用断点进行调试时,问题却再也无法重现,或者是变得很难重现(本文将实例演示这种情况)。
- 一个运行正常的程序,在使用调试器跟踪它的代码逻辑时,只要一进行单步运行或者断点调试,就会遇到很多莫名奇妙的问题。
这是为什么呢?
![8d47363528e18d40a6ef64d267169555.png](https://i-blog.csdnimg.cn/blog_migrate/df3468bd4f957d95761c225f0205f890.jpeg)
有经验的开发者,会立即想到,这是因为在调试器中运行程序时,单步执行和断点调试为程序执行的时序引入了不确定性,改变了代码的执行逻辑。
尤其在复杂的多进程或多线程的系统中,即便你用调试器只跟踪你感兴趣的其中一个进程或线程,但这仍然可能会对影响到系统的正常执行逻辑。
这个时候,我们就应该调整一下思路,换一种调试方法了。
![a60494eea4dbddfdce1452b5b94a4289.png](https://i-blog.csdnimg.cn/blog_migrate/cea1e7eb90d6426171d3669b738b229e.jpeg)
本文的缘由
在Linux环境下编程开发的朋友,肯定都用过GDB吧,它的强大,无需多言。
可是,很多朋友对GDB的了解,仅限于普通的断点、单步执行、print变量等最基础的功能。而对它的一些高阶特性,却知之甚少。