我有一个非常令人沮丧的错误,团队中的其他人无法重现。我尝试过清理项目、擦除目录、从存储库中提取、重建,甚至在 VS 2013 中进行测试。
背景:ac、bc、cc 和 b.inc 都被编译成一个 DLL(假设它们是外部的)。setfoo()
首先从托管代码中调用。到目前为止,一切都很好。
后来,testfoo()
被称为。全局变量很好,没有问题。然后 testfoo2()
被调用。这就是事情变得有趣的地方。我用foo's
地址打开了内存调试器,它将读取 4 in memory。但是,如果您将鼠标悬停在 Visual Studio 中的代码上,它会返回 0!。此外,它将输出 0。有许多全局变量(包括FILE
句柄,它们被重置为零(导致令人讨厌的 ASSERT 失败),仅在 cc 中,但在使用调试器检查时很好)。有许多其他 xc 模块包含没有问题。
好的,现在testfoo()
又被调用了。公元前世界一切都很好。可怕的是,这个问题只发生在我的工作站上!关于如何调试的任何线索?
这是我的记忆,我相信代码非常接近这个骨架:
b.inc
int foo;
交流
#include <b.inc>
void setfoo(){
foo = 4;
}
公元前
#include <b.inc>
void testfoo(){
printf(foo); //works
}
抄送
#include <b.inc>
void testfoo2(){
printf(foo); //foo is now 0
}
添加:这是非常复杂的遗留代码(想想 70 年代),在一家非常大的公司中,没有什么可以改变的。如果我们开始添加 extern,将会有数千个变量受到影响。另外,我在一个变量上尝试了 extern,但该文件仍然存在问题。
我遗漏了一个花絮。'testfoo2()' 在托管线程中启动。同样,这似乎与我的机器有关,可能是 Visual Studio 中的一些设置,此时不知道,我们只想重新映像盒子。