トップ回答者
[デバッグの停止]でも実行は止まらない?

質問
-
Web サイトプロジェクトの話ですが、[デバッグの停止]でデバッグは止ま
っても、その後のコードが実行されてしまいます。皆さんの環境ではそのような現象は出ないでしょうか? お聞かせいただ
けると幸いです。
具体的な例を以下に書きます。
以下のコードで、ブレークポイントを最初の { カッコに設定します。
Code Snippetprotected 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にデータが書き込まれて
しまう」で気がつきました。
回答
-
停止ボタンでウェブサービスを終了したい場合には、プロジェクトのプロパティ > 開始オプション > デバッガ > ネイティブを ON にしてください。この機能は Express 版では提供されません。(スタンダードならあるかな?)すこし細かい話をすると、この機能が OFF の場合、Visual Studio はデバッグの中止を実行すると、マネージドデバッガをデタッチして処理を継続するという仕様になっているためです。asp.net の開発では、IIS または 開発用ウェブサーバ は通常は起動したら終了することなく動作し続けます。これは、IIS をデバッガによって強制的に停止することが運用上であまり良い状態を作り出さないことや、IIS や開発用ウェブサーバを頻繁にダウンさせながらの開発が、ほとんどの開発者にとって大きなストレスを産みだすことなどと比較して、マネージドコードの開発におけるデバッグの挙動を考慮した結果だと思います。実際に、ASP.NET のプロジェクトのデバッグを開始すると、タスクトレイなどに開発用ウェブサーバが起動しちょっとやそっとの操作では終了することなく稼動しつづける、ということに気がついている人は多いと思います。そして、いつでも気軽にデバッグを開始したり中断したりしつつ、ブラウザで開発用ウェブサーバ内のページを自由に移動できたりします。これに対して、ネイティブデバッグが ON である場合、Visual Studio は様々なシチュエーションがサービスプロセスに適用され、サービスプロセスそのものを終了することが大きな意味を持つことを想定します。このため、デバッグの中止によって IIS や開発用ウェブサーバが毎回ダウンするようになります。
すべての返信
-
停止ボタンでウェブサービスを終了したい場合には、プロジェクトのプロパティ > 開始オプション > デバッガ > ネイティブを ON にしてください。この機能は Express 版では提供されません。(スタンダードならあるかな?)すこし細かい話をすると、この機能が OFF の場合、Visual Studio はデバッグの中止を実行すると、マネージドデバッガをデタッチして処理を継続するという仕様になっているためです。asp.net の開発では、IIS または 開発用ウェブサーバ は通常は起動したら終了することなく動作し続けます。これは、IIS をデバッガによって強制的に停止することが運用上であまり良い状態を作り出さないことや、IIS や開発用ウェブサーバを頻繁にダウンさせながらの開発が、ほとんどの開発者にとって大きなストレスを産みだすことなどと比較して、マネージドコードの開発におけるデバッグの挙動を考慮した結果だと思います。実際に、ASP.NET のプロジェクトのデバッグを開始すると、タスクトレイなどに開発用ウェブサーバが起動しちょっとやそっとの操作では終了することなく稼動しつづける、ということに気がついている人は多いと思います。そして、いつでも気軽にデバッグを開始したり中断したりしつつ、ブラウザで開発用ウェブサーバ内のページを自由に移動できたりします。これに対して、ネイティブデバッグが ON である場合、Visual Studio は様々なシチュエーションがサービスプロセスに適用され、サービスプロセスそのものを終了することが大きな意味を持つことを想定します。このため、デバッグの中止によって IIS や開発用ウェブサーバが毎回ダウンするようになります。
-
K.Takaoka さん>
詳しい説明をいただき、有難うございました。
ただ、連絡いただいたオプション設定は分からなかったです。
自分の探し方が悪いのだと思いますが、「プロジェクトのプロパティ > 開始オ
プション > デバッガ > ネイティブ」というのは自分の Visual Studio のメニ
ューには見あたりません。Web サイトプロジェクトでは、どこにもそのようなメニューは見当たりません。
Web アプリケーションプロジェクトの場合、メニューバーに[プロジェクト]が
あって、そこには[XXXXX のプロパティ]があるのですが、それをクリックして
出てきたメニューの中にはオプション([開始オプション][デバッガ][ネイ
ティブ]等)は見当たりません。何にせよ、実行がとまらないのは仕様らしいというのはわかりました。有難う
ございました。 -
karashima さんからの引用 # 「Web サイト」を使用しないので気付きませんでしたが
「ASP.NET Web アプリケーション」と挙動が異なっている様なので
個人的にはあまり気持ちいいものではないですね。
自分の環境では、Web サイトプロジェクトでも、Web アプリケーションプロジェ
クトでも、、[デバッグの停止]でデバッガのコントロールが外れて、コードが
勝手に走っていってしまうのは同じでした。ただ、最初の質問でアップしたサンプルの場合、Web アプリケーションプロジェ
クトで試すと、ソリューションエクスプローラで見てもファイルが追加されてい
るのは分かりません(OS 付属のエクスプローラで見ると分かります)。 -
SurferOnWww さんからの引用 自分の環境では、Web サイトプロジェクトでも、Web アプリケーションプロジェ
クトでも、、[デバッグの停止]でデバッガのコントロールが外れて、コードが
勝手に走っていってしまうのは同じでした。私の環境では
SurferOnWwwさんのサンプルコードを
「Web アプリケーション」で作成した場合はファイルは作成されません。
と書いたところで、ん?もしかして・・・
string path = Page.Server.MapPath("~/Test/testfile1.txt");
を
string path = "/Test/testfile1.txt";
に変更して、試してみました。
同じ様に、「Web アプリケーション」でもファイルが作成されました。 -
K.Takaoka さんからの引用 ソリューションエクスプローラーから、プロジェクトを右クリックしてプロパティを開いたんですけど、メニューからだとどこかなー?(VisualStudioのないところから返信しているため確認できず)Web サイトプロジェクトでは、連絡いただいたとおり、ソリューションエクス
プローラのアプリケーションルートの右クリックでオプション設定が見つかり
ました。やはり探し方が悪かったです。お手数をおかけしてすみませんでした。ただし、Web アプリケーションプロジェクトではその方法ではメニューが出て
きませんでした。別の方法があるのかもしれません。ヘルプの説明では、[ネイティブ コード]にチェックを入れると「デバッガを起動するたびにネイティブ (アンマネージ) コード用デバッガが読み込まれます。このオプションは、C++ などのアンマネージ言語で記述されたコンポーネント(COM コンポーネントなど) を Web サイトが呼び出す場合に役立ちます。・・・」と書いてあるだけで、実行がとまるとは書いてなかったですが、試してみると確かに止まりました。 -
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"; としても、同じところで同じ例外
がスローされると思うのですが・・・ -