none
[デバッグの停止]でも実行は止まらない? RRS feed

  • 質問

  • Web サイトプロジェクトの話ですが、[デバッグの停止]でデバッグは止ま
    っても、その後のコードが実行されてしまいます。

     

    皆さんの環境ではそのような現象は出ないでしょうか? お聞かせいただ

    けると幸いです。

     

    具体的な例を以下に書きます。

     

    以下のコードで、ブレークポイントを最初の { カッコに設定します。

     

    Code Snippet

    protected void Page_Load(object sender, EventArgs e)
    {
        string path = Page.Server.MapPath("~/Test/testfile1.txt");
        using (StreamWriter writer = File.CreateText(path))
        {
            writer.WriteLine("Hello World!");
        }

        path = Page.Server.MapPath("~/Test/testfile2.txt");
        using (StreamWriter writer = File.CreateText(path))
        {
            writer.WriteLine("Welcome!");
        }
    }

     

     

    [デバッグ開始]するとブレークポイントで止まります。その時点ではファ
    イルはできていません(当然ですね)。しかし、そこで[デバッグの停止]
    すると、ファイルは2つとも作成されてしまいます(これが問題)。

     

    再度[デバッグ開始]し(できたファイルは削除してから)、ブレークポイ
    ントからステップ実行してみました。そうするとステップの通りファイルが
    作成されていきます。例えば、最初の File.CreateText(path) を抜けた

    時点で空のファイル testfile1.txt が作成され、using を抜けるとファイル

    に Hello World! が書き込まれます。デバッガ上のステップどおり動い

    ているという感じです。ところが、そこで[デバッグの停止]すると、2つ

    目のファイル testfile2.txt もできてしまいます。

     

    どうも、[デバッグの停止]でデバッガのコントロールが外れて、コードが
    勝手に走っていってしまうような感じです。

     

    自分が試した環境は以下のとおりです。

     

    (1) Vista Ultimate SP1 + .NET 3.5 SP1 + VS2008 Pro SP1
    (2) Vista HP SP1 + .NET 3.5 SP1 + VS2005 Exp
    (3) XP Pro SP3 + .NET 3.5 + VWD2008 Exp

     

    なお、コンソールアプリで上記と同様なコードを使って試してみましたが、
    その場合は上記のような問題はなかったです。(ただし、これは上記 (3)
    の環境で VC#2008 Exp で試しただけです)。


    この件は、ASP.NET フォーラムのスレッド「デバッグ時にコネクションオブ
    ジェクトをOpenする前に停止ボタンを押してもSQLにデータが書き込まれて
    しまう」で気がつきました。

    2008年12月8日 12:19

回答

  • 停止ボタンでウェブサービスを終了したい場合には、
     
    プロジェクトのプロパティ > 開始オプション > デバッガ > ネイティブ
     
    を ON にしてください。この機能は Express 版では提供されません。(スタンダードならあるかな?)
     
     
    すこし細かい話をすると、この機能が OFF の場合、Visual Studio はデバッグの中止を実行すると、マネージドデバッガをデタッチして処理を継続するという仕様になっているためです。asp.net の開発では、IIS または 開発用ウェブサーバ は通常は起動したら終了することなく動作し続けます。これは、IIS をデバッガによって強制的に停止することが運用上であまり良い状態を作り出さないことや、IIS や開発用ウェブサーバを頻繁にダウンさせながらの開発が、ほとんどの開発者にとって大きなストレスを産みだすことなどと比較して、マネージドコードの開発におけるデバッグの挙動を考慮した結果だと思います。
     
    実際に、ASP.NET のプロジェクトのデバッグを開始すると、タスクトレイなどに開発用ウェブサーバが起動しちょっとやそっとの操作では終了することなく稼動しつづける、ということに気がついている人は多いと思います。そして、いつでも気軽にデバッグを開始したり中断したりしつつ、ブラウザで開発用ウェブサーバ内のページを自由に移動できたりします。
     
    これに対して、ネイティブデバッグが ON である場合、Visual Studio は様々なシチュエーションがサービスプロセスに適用され、サービスプロセスそのものを終了することが大きな意味を持つことを想定します。このため、デバッグの中止によって IIS や開発用ウェブサーバが毎回ダウンするようになります。
    2008年12月8日 15:59

すべての返信

  • 停止ボタンでウェブサービスを終了したい場合には、
     
    プロジェクトのプロパティ > 開始オプション > デバッガ > ネイティブ
     
    を ON にしてください。この機能は Express 版では提供されません。(スタンダードならあるかな?)
     
     
    すこし細かい話をすると、この機能が OFF の場合、Visual Studio はデバッグの中止を実行すると、マネージドデバッガをデタッチして処理を継続するという仕様になっているためです。asp.net の開発では、IIS または 開発用ウェブサーバ は通常は起動したら終了することなく動作し続けます。これは、IIS をデバッガによって強制的に停止することが運用上であまり良い状態を作り出さないことや、IIS や開発用ウェブサーバを頻繁にダウンさせながらの開発が、ほとんどの開発者にとって大きなストレスを産みだすことなどと比較して、マネージドコードの開発におけるデバッグの挙動を考慮した結果だと思います。
     
    実際に、ASP.NET のプロジェクトのデバッグを開始すると、タスクトレイなどに開発用ウェブサーバが起動しちょっとやそっとの操作では終了することなく稼動しつづける、ということに気がついている人は多いと思います。そして、いつでも気軽にデバッグを開始したり中断したりしつつ、ブラウザで開発用ウェブサーバ内のページを自由に移動できたりします。
     
    これに対して、ネイティブデバッグが ON である場合、Visual Studio は様々なシチュエーションがサービスプロセスに適用され、サービスプロセスそのものを終了することが大きな意味を持つことを想定します。このため、デバッグの中止によって IIS や開発用ウェブサーバが毎回ダウンするようになります。
    2008年12月8日 15:59
  •  SurferOnWww さんからの引用

    Web サイトプロジェクトの話ですが、[デバッグの停止]でデバッグは止ま
    っても、その後のコードが実行されてしまいます。


    # 「Web サイト」を使用しないので気付きませんでしたが

    「ASP.NET Web アプリケーション」と挙動が異なっている様なので

    個人的にはあまり気持ちいいものではないですね。

    2008年12月8日 17:59
  • K.Takaoka さん>

     

    詳しい説明をいただき、有難うございました。

     

    ただ、連絡いただいたオプション設定は分からなかったです。

     

    自分の探し方が悪いのだと思いますが、「プロジェクトのプロパティ > 開始オ
    プション > デバッガ > ネイティブ」というのは自分の Visual Studio のメニ
    ューには見あたりません。

     

    Web サイトプロジェクトでは、どこにもそのようなメニューは見当たりません。

    Web アプリケーションプロジェクトの場合、メニューバーに[プロジェクト]が
    あって、そこには[XXXXX のプロパティ]があるのですが、それをクリックして
    出てきたメニューの中にはオプション([開始オプション][デバッガ][ネイ
    ティブ]等)は見当たりません。

     

    何にせよ、実行がとまらないのは仕様らしいというのはわかりました。有難う
    ございました。

    2008年12月9日 12:52
  •  karashima さんからの引用

    # 「Web サイト」を使用しないので気付きませんでしたが

    「ASP.NET Web アプリケーション」と挙動が異なっている様なので

    個人的にはあまり気持ちいいものではないですね。

     

    自分の環境では、Web サイトプロジェクトでも、Web アプリケーションプロジェ
    クトでも、、[デバッグの停止]でデバッガのコントロールが外れて、コードが
    勝手に走っていってしまうのは同じでした。

     

    ただ、最初の質問でアップしたサンプルの場合、Web アプリケーションプロジェ
    クトで試すと、ソリューションエクスプローラで見てもファイルが追加されてい
    るのは分かりません(OS 付属のエクスプローラで見ると分かります)。

    2008年12月9日 12:53
  • > 自分の Visual Studio のメニューには見あたりません。
     
    ソリューションエクスプローラーから、プロジェクトを右クリックしてプロパティを開いたんですけど、
    メニューからだとどこかなー?(VisualStudioのないところから返信しているため確認できず)
     
    2008年12月9日 15:30
  •  SurferOnWww さんからの引用

    自分の環境では、Web サイトプロジェクトでも、Web アプリケーションプロジェ
    クトでも、、[デバッグの停止]でデバッガのコントロールが外れて、コードが
    勝手に走っていってしまうのは同じでした。

    私の環境では

    SurferOnWwwさんのサンプルコードを
    「Web アプリケーション」で作成した場合は

    ファイルは作成されません。


    と書いたところで、ん?もしかして・・・

        string path = Page.Server.MapPath("~/Test/testfile1.txt");

        string path = "/Test/testfile1.txt";
    に変更して、試してみました。
    同じ様に、「Web アプリケーション」でもファイルが作成されました。

    2008年12月9日 17:57
  •  K.Takaoka さんからの引用
    ソリューションエクスプローラーから、プロジェクトを右クリックしてプロパティを開いたんですけど、
    メニューからだとどこかなー?(VisualStudioのないところから返信しているため確認できず)
     
    Web サイトプロジェクトでは、連絡いただいたとおり、ソリューションエクス
    プローラのアプリケーションルートの右クリックでオプション設定が見つかり
    ました。
     
    やはり探し方が悪かったです。お手数をおかけしてすみませんでした。
     
    ただし、Web アプリケーションプロジェクトではその方法ではメニューが出て
    きませんでした。別の方法があるのかもしれません。
     
    ヘルプの説明では、[ネイティブ コード]にチェックを入れると「デバッガを起動
    するたびにネイティブ (アンマネージ) コード用デバッガが読み込まれます。こ
    のオプションは、C++ などのアンマネージ言語で記述されたコンポーネント
     (COM コンポーネントなど) を Web サイトが呼び出す場合に役立ちます。
    ・・・」と書いてあるだけで、実行がとまるとは書いてなかったですが、試して
    みると確かに止まりました。
    2008年12月10日 13:12
  •  karashima さんからの引用

    私の環境では

    SurferOnWwwさんのサンプルコードを
    「Web アプリケーション」で作成した場合は

    ファイルは作成されません。


    と書いたところで、ん?もしかして・・・

        string path = Page.Server.MapPath("~/Test/testfile1.txt");

        string path = "/Test/testfile1.txt";
    に変更して、試してみました。
    同じ様に、「Web アプリケーション」でもファイルが作成されました。

     

    すみません、説明不足でした。

     

    先のサンプルは、アプリケーションのルート直下に Test という既存のフ
    ォルダがあることが前提です。

     

    Test フォルダが存在しない場合、File.CreateText(path) のところで例
    外 DirectoryNotFoundException がスローされ、ファイルは作成されませ
    ん。

     

    でも、path = "/Test/testfile1.txt"; としても、同じところで同じ例外
    がスローされると思うのですが・・・

    2008年12月10日 13:14
  •  SurferOnWww さんからの引用

    先のサンプルは、アプリケーションのルート直下に Test という既存のフ
    ォルダがあることが前提です。

    すみません。
    それは分かってたのですが
    すごい勘違いしてました。
    アプリケーションルート直下にフォルダを作成してたのですが
    その中にある他のファイルを出力ディレクトリにコピーする様にしてたので
    bin直下にできたフォルダの方を確認してました。
    私の環境でも
    「Web サイト」「Web アプリケーション」のどちらでも
    その後のコードが実行されるのは同じでした。
    私の勘違いで、不正確な書き込みをして申し訳ありませんでした。
    2008年12月12日 17:35