GDB中的打印变量似乎改变了代码行为?

时间:2018-05-18 17:57:39

标签: c++ gdb 32bit-64bit

我正在调试我们刚刚升级OS /驱动程序的一大段古老代码,整个程序运行32位。代码的原始开发人员早已不复存在,其中大部分仍然是我的黑盒子。

我在调试器上运行它。我在一个更大的循环中缩小了特定的if语句,我需要' else'要运行以更新某些变量的for循环的一部分,但它从未运行过;暗示正在检查的变量是'如果'陈述总是如此。

最终我进入了方法调用(一个私有布尔的简单getter)并打印了变量的内容。当我打印变量时,它是错误的,而其他'我回来时会输入方法。

要试验我已尝试让循环运行10分钟,其他'永远不会输入方法(由未被击中的断点表示)。然后,当我打印被检查的变量时,它为false并输入变量。无论我让它运行多久,或者在打印变量之前打破并继续多少次,同样的模式成立,我输入其他'否则'方法IFF我首先打印正在检查的变量的内容。

为了排除某种类型的数据流,我尝试坐在有问题的断点处查看打印声明所需的时间,没有打印的延迟不会导致进入& #39;否则'方法

什么可能导致这种奇怪的行为?由于我们遇到了不同架构的问题,在64位操作系统上运行32位程序,更重要的是,它使用的驱动程序多年未经过32位测试,直到他们在32位架构下为我重新编译驱动程序,会让我怀疑驱动程序除了行为不正常的特定行代码之外没有任何方式触及驱动程序。我仍然怀疑由于试图强制运行旧的32位程序引起的混乱,可能会发生某种溢出或下溢。

然而,即使假设这可能会导致这种奇怪的行为,我也不知道如何确认是否正在发生这种情况,或者以其他方式调试程序,其中查看它的行为改变了它的行为。我喜欢任何可能导致此类问题的提示,或者我可以继续调试它。

该死的吉姆我是一名程序员,而不是量子机械师!

0 个答案:

没有答案