c语言运行和调试为什么结果不一样_调试引入的不确定性:必现的BUG神秘消失,断点改变代码执行逻辑

本系列专题,旨在讲解一些非常实用,却鲜为人知的高阶调试技巧,以及调试器的实现原理,和常见问题的定位方法和思路。

感兴趣的朋友,欢迎右上角关注!

引言 - 调试引入的不确定性

在调试代码或者定位问题的时候,大家有没有遇到过下面这两种情况:

  1. 一个100%必现的代码BUG,在单步跟踪或者使用断点进行调试时,问题却再也无法重现,或者是变得很难重现(本文将实例演示这种情况)。
  2. 一个运行正常的程序,在使用调试器跟踪它的代码逻辑时,只要一进行单步运行或者断点调试,就会遇到很多莫名奇妙的问题。

这是为什么呢?

8d47363528e18d40a6ef64d267169555.png

有经验的开发者,会立即想到,这是因为在调试器中运行程序时,单步执行和断点调试为程序执行的时序引入了不确定性,改变了代码的执行逻辑。

尤其在复杂的多进程或多线程的系统中,即便你用调试器只跟踪你感兴趣的其中一个进程或线程,但这仍然可能会对影响到系统的正常执行逻辑。

这个时候,我们就应该调整一下思路,换一种调试方法了。

a60494eea4dbddfdce1452b5b94a4289.png

本文的缘由

在Linux环境下编程开发的朋友,肯定都用过GDB吧,它的强大,无需多言。

可是,很多朋友对GDB的了解,仅限于普通的断点、单步执行、print变量等最基础的功能。而对它的一些高阶特性,却知之甚少。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值