チームの他のメンバーが再現できない非常に苛立たしいバグがあります。プロジェクトのクリーニング、ディレクトリのワイプ、リポジトリからのプル、再構築、さらには VS 2013 でのテストも試みました。
背景: ac、bc、cc、および b.inc はすべて DLL にコンパイルされます (外部化されていると仮定します)。setfoo()
マネージド コードから最初に呼び出されます。ここまでは順調ですね。
後でtestfoo()
呼び出されます。グローバル変数は問題ありません。問題はありません。その後 testfoo2()
、呼び出されます。ここからが興味深いところです。foo's
アドレスを指定してメモリ デバッガをオンにすると、メモリ内の 4 が読み取られます。ただし、Visual Studio でコードにカーソルを合わせると、0! が返されます。また、0 が出力されます。多くのグローバル変数があります (FILE
ハンドルを含み、それらはゼロにリセットされます (厄介な ASSERT 失敗の原因となります)、cc でのみですが、デバッガーで検査すると問題ありません)。問題のないものを含む他の多くの xc モジュールがあります。
わかりました、今testfoo()
再び呼び出されます。bcワールドではすべてが順調です。恐ろしいのは、問題が私のワークステーションでのみ発生することです! これをデバッグする方法についての手がかりはありますか?
これは私の記憶によるものです。コードはこのスケルトンに非常に近いと思います。
ビーインク
int foo;
交流
#include <b.inc>
void setfoo(){
foo = 4;
}
紀元前
#include <b.inc>
void testfoo(){
printf(foo); //works
}
cc
#include <b.inc>
void testfoo2(){
printf(foo); //foo is now 0
}
追加する: これは非常に複雑なレガシー コード (70 年代と考えてください) であり、非常に大規模な企業であり、あまり変更することはできません。extern の追加を開始すると、影響を受ける変数が何千もあります。また、1 つの変数で extern を試しましたが、そのファイルにはまだ問題があります。
私は一口を残しました。「testfoo2()」はマネージド スレッドで起動します。繰り返しますが、これは私のマシンに関連しているようです。ビジュアル スタジオの設定である可能性があります。この時点ではわかりません。ボックスのイメージを再作成したいだけです。