VC.NET ~ 突然、ブレークがかからなくなる

現象

Visual Studioでデバッグ実行していると、別にコンパイルオプションをいじった訳でもないのに、突然、ブレークがかからなくなることがあります。この現象の特徴は次の通りです。

  • ソースファイルを変更してデバッグ実行したときに起きる
  • 特定のソースファイルで起きる(同じプロジェクト内の別のファイルでは起きない)
  • デバッグシンボルが読み込めてないかのような状態
  • そのソース内のコードへステップインしようとすると「ソースファイルがモジュールがビルドされたときのものと異なります。」というメッセージボックスが出る
  • 英語版Visual Studioの場合、メッセージは"The source file is different from when the module was built."
  • リビルドしても解消しない
  • Debugフォルダや中間ファイルを削除してビルドしなおしても解消しない
  • Visual StudioやWindowsを再起動してもダメ

あと、自分の経験では、1つのソリューションで複数のプロジェクトを管理している場合に起きやすい気がします。例えば、exe用プロジェクトが4つ、dll用が1つ、スタティックリンクライブラリ用が3つとか。

メッセージボックスの台詞にある通り、今のソースがビルドしたときの物と違うので、行番号がズレて、まともにトレースできない、というのがVisual Studioの言い分です。しかし、リビルドしても解消しないので、この言い分は的外れです。

MSの回避策

ググると見つかりますが、マイクロソフトの「Visual Studio 2008 ワンポイント」というコーナーに回避策が載っています。

[ツール]、[オプション]、[デバッグ]、[全般]の順にクリックし、
[元のバージョンと完全に一致するソースファイルを必要とする]チェックボックスを
オフにします。

たしかに、これでも回避できますが、本質的な解決にはなってませんね。

真の問題は、なぜVisual Studioが「ソースファイルがモジュールがビルドされたときのものと異なる」と誤認識してしまうか、という点のはずです。

真の原因?

海外のサイトを検索してみると、どうやら、ソースファイル内の非ASCII文字がトリガになっているようです。

Visual Studioは、ソースファイルのハッシュ値(MD5)を使って、ビルド時とデバッグ実行時のソースの同一性を判定しており、このハッシュ値計算にバグがあるため、ソースファイル内に全角文字などが入っていると、ハッシュ値が不正確になってしまうようです。不正確なりに結果が安定しているのなら良いのですが、ビルド時とデバッグ実行時とで別々のハッシュ値を算出してしまっているのが残念ですね。

試しに、ソースファイルの先頭に書いていたコメント内の全角文字を削除してみたら、現象が解消しました。もちろん、全角文字を使うと必ず起きるというわけではありません(もしそうなら、大問題になっているはずですし)。また、ファイル先頭のコメントはそのままにして、別の場所にASCII文字のコメントを追加しただけで現象が解消したケースもあります。つまり、ハッシュ不一致のバグが表面化する条件は、もっと複雑みたいです。

というわけで、個人的には、この現象が起きたら、現象が起きなくなるまで、ソースファイルを適当に修正する、というのが当面の解決策になっています。

Last modified:2011/11/04 22:14:54
Keyword(s):
References:[.NETアプリ開発]
This page is frozen.