所以我有一个C程序.而且我认为由于复杂性问题我不能发布任何代码片段.但我会概述我的错误,因为它很奇怪,看看是否有人可以给出任何见解.
我设置了一个指针NULL.如果,在我设置指针的同一个函数中NULL,我printf()指针(带"%p"),我得到0x0,当我在程序结束时打印一百万英里外的相同指针时,我得到了0x0.如果我删除printf()并且绝对不做任何其他更改,那么当稍后打印指针时,我会得到0x1,并且我的结构中的其他随机变量也具有不正确的值.我正在用GCC编译它-O2,但是如果我取消优化它会有相同的行为,所以这不是问题.
这听起来像是一个Heisenbug,我不知道它为什么会发生,也不知道如何解决它.过去曾经处理过类似问题的人有没有就如何解决这类问题提出建议?我知道这听起来有点模糊.
编辑:不知何故,它现在有效.谢谢大家,感谢您的建议.
调试器告诉我有趣的事情 - 我的变量被优化了.所以我重新编写了函数,因此它不需要中间变量,现在它可以使用和不使用printf().我对可能发生的事情有一个模糊的概念,但我需要的睡眠比我需要知道的更多.
你使用多线程吗?我经常发现打印出来的行为可以足以有效地抑制竞争条件(即不删除错误,只是让它更难发现).
至于如何诊断/修复它...你可以更早和更早地移动第二个印刷品,直到你能看到它在哪里变化?
当你没有在那里时,你总是看到0x1 printf吗?
避免延迟/同步的一种方法是printf将指针值复制到第一个位置的另一个变量中printf,然后在以后打印出该值 - 这样你就可以看到该点的值是什么,但是更少时间紧迫的地方.当然,正如你有奇怪的价值"腐败",这可能不如听起来那么可靠......
编辑:你总是看到0x1的事实令人鼓舞.它应该更容易追踪.诚然,不是多线程确实会让它稍微难以解释.
我想知道这是否与额外的printf调用有关,这会对堆栈的大小产生影响.如果在与第一个printf调用相同的位置打印另一个变量的值,会发生什么?
编辑:好的,让我们进一步了解堆栈的想法.你能创建另一个具有相同签名的函数,printf并且有足够的代码来避免它被内联,但实际上什么都不打印?称之为而不是printf,看看会发生什么.我怀疑你还是会好的.
基本上我怀疑你在某个地方搞乱你的堆栈内存,例如通过写入堆栈中的数组末尾; 通过调用函数来改变堆栈的使用方式可能是在伪装它.