Windows

ソースファイルがモジュールがビルドされたときのものと異なります。デバッガでこのファイルを使用しますか?

Windows

Visual Studioでデバッグをしているとダイアログボックスが出てこんなメッセージが表示されることがあります。

「ソースファイルがモジュールがビルドされたときのものと異なります。デバッガでこのファイルを使用しますか?」

一応、質問文なのでダイアログボックスには「はい」と「いいえ」のボタンがあるのですが、どちらを押しても結果は同じです。

デバッグできない

「はい」を選ぼうが「いいえ」を選ぼうが、Visual Studioはこんなダイアログボックスを表示します。

現在の場所のソースコードを表示できません。

「現在の場所のソースコードを表示できません。」

ご丁寧に「逆アセンブルの表示」なんてボタンがついていますが、今時、誰がアセンブラでデバッグなんてするのかと・・・。

Visual Studioのソリューションエクスプローラーなどからソースコードを表示してみてもブレークポイントもかけられないし、デバッグでそのソースコードの関数にステップインすることもできません。

これではデバッグ作業ができません。

原因と解決方法

こうなってしまうのにはいくつか原因があるようで、原因によって取るべき解決方法は違ってきます。

ソースファイルよりモジュールのほうが古い

ソースコードを間違って編集して保存してしまったとか、何らかの原因でデバッグ中のモジュール(DLLやEXE)が古い場合。

この場合、Visual Studioの言っていることは正しいです。

まずはイの一番にこれを確認すべきでしょう。

ソースファイルのタイムスタンプとデバッグ対象のモジュールのタイムスタンプを調べます。

ただ、この場合は「ソースファイルがモジュールがビルドされたときのものと異なります。デバッガでこのファイルを使用しますか?」で「はい」と答えるとソースコードは表示されるんですよね。

そうやって表示させるとソースコードとモジュールが合ってないのでデバッガでの停止位置がずれたりするものの、なんとかデバッグはできます。

解決方法はもちろんビルドし直して、ソースファイルよりモジュールのタイムスタンプが新しくなることを確認することです。

ビルドし直してもモジュールのタイムスタンプが変わらない、なんて場合はデバッグ以前にビルド設定が何か間違っています。

MSDN blogの方法?

マイクロソフトのMSDN blogにこんな記事があります。

ググッてこの記事を見つけて、なんだ原因と解決方法が公式サイトにあるじゃん、と思うのは甘い。

この記事の方法とは、

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

というものです。

この設定を行うとたしかにソースコードが表示されるようになることはあります。

おそらく表示されないのはVisual Studioのバグで、この設定でそのバグを回避できるのでしょう。

しかし、この設定は前述の「ソースファイルよりモジュールのほうが古い」状態でも常に強引にデバッグをする、というためのものです。

この設定をするとソースコードとモジュールの整合性が取れてなくても警告が出なくなってしまいます。

ncbファイルが壊れている

Visual Studioは拡張子ncbのファイルにさまざまな情報を保存しています。

このncbファイルは何かの拍子に壊れてしまうことがあるようで、Visual Studioの挙動がどうもおかしい時はVisual Studioを終了し、ncbファイルを削除することで治ることがあります。

Visual Studioは起動時にncbファイルがないと再度生成します。

「ソースファイルがモジュールがビルドされたときのものと異なります。デバッガでこのファイルを使用しますか?」の場合もncbファイルの削除で治る場合があります。

時々、ncbファイルが壊れるのは大昔からあってVisual Studioのバグなんでしょうけど、一体いつになったら治るのでしょうか・・・。

ソースファイルがシフトJISだとダメ?

ソースコードをビルドし直しても、ncbファイルを削除しても治らず(もちろんMSDN blogの方法などやる気はありません)途方にくれていた時、試行錯誤でソースコードをシフトJISからUnicode(UTF-8 シグネチャ付き)に変更したら治ってしまったことがあります。

Unicodeで保存し直す方法はVisual Studioの「ファイル」 - 「保存オプションの詳細設定」メニューで「保存オプション」の詳細設定を開き、「エンコード」コンボボックスで「Unicode(UTF-8 シグネチャ付き)」を選択します。

今のところ、この方法で解決しなかったことはありません。

このことから「ソースファイルがモジュールがビルドされたときのものと異なります。デバッガでこのファイルを使用しますか?」が表示されるVisual StudioのバグとはシフトJISのソースコード処理に関連するのではないかと疑っています。