C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: デバッグモードとリリースモードの違い


(過去ログ 73 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■42778 / inTopicNo.1)  デバッグモードとリリースモードの違い
  
□投稿者/ ようすけ (1回)-(2009/10/21(Wed) 11:13:30)

分類:[ASP.NET (C#)] 

ASP.NET(C#)でのWebアプリ開発をしております。
ある不具合の発生のタイミングがデバッグ時とリリースモード時で異なります。

不具合の原因自体はわかっており、そこを修正すれば解決するのですが、
それとは別になぜそのタイミングでエラーが発生するのかを人に説明しなければなりません。
どう説明すればよいかアドバイスいただませんでしょうか。

画面(A)にドロップダウンリストが複数あります。
画面(A)が起動され、ページロード時にドロップダウンリストを初期化します。

画面(A)から画面(B)へ遷移します。
画面(B)から画面(A)へ戻ります。(Redirect)
再び画面(A)のページロードが実行されドロップダウンリストを初期化します。


不具合はドロップダウンリストの初期化にあります。
(エラーの内容は「DropDownListには複数の項目を選択できません」です。
複数のDropDownListに、同じListItemを登録してしまっており、その後、各DropDownListの初期表示としての選択値をListItemのSelectedプロパティ=tureで設定しているため、Selectedプロパティ=tureのListItemが複数になってしまっています。)

デバッグでブレークポイントを置いて実行すると最初の初期化でエラーが発生します。
リリースモードでは画面(B)から画面(A)に戻ってきた時の初期化でエラーが発生します。
(画面(A)起動時の初期化ではエラーにならない)

おそらく、本来エラーとなるはずなのに、なぜリリースモードで実行した時の最初の初期化はエラーになっていないのかを知りたいのだと思います。

デバッグとリリースでは、ファイルサイズや実行速度、プログラムの実行が最適化されているされていないなどの違いがあるのは知っています。

どういう風に説明すればよいでしょうか。
引用返信 編集キー/
■42780 / inTopicNo.2)  Re[1]: デバッグモードとリリースモードの違い
□投稿者/ はつね (1091回)-(2009/10/21(Wed) 11:31:59)
はつね さんの Web サイト
> おそらく、本来エラーとなるはずなのに、なぜリリースモードで実行した時の
> 最初の初期化はエラーになっていないのかを知りたいのだと思います。

配列とかコレクションの範囲チェックとか、何かリリースモードでは処理速度の
向上のために実害がでるまでチェックしていないチェックの差なんじゃないで
しょうか(推測、未確認)。

引用返信 編集キー/
■42781 / inTopicNo.3)  Re[1]: デバッグモードとリリースモードの違い
□投稿者/ とっちゃん (422回)-(2009/10/21(Wed) 11:58:33)
とっちゃん さんの Web サイト
No42778 (ようすけ さん) に返信

> デバッグでブレークポイントを置いて実行すると最初の初期化でエラーが発生します。
> リリースモードでは画面(B)から画面(A)に戻ってきた時の初期化でエラーが発生します。
> (画面(A)起動時の初期化ではエラーにならない)
>
ブレークポイントを張らずにデバッグ版を実行してもそうなりますか?
また、デバッグ実行しない場合も同様でしょうか?

同じ現象になるかどうかを確認する場合は、まずは可能な限り同じ条件で実行することです。
今回の場合、リリース版でも同じ位置にブレークポイントを置いてデバッグ実行してみるか
デバッグ版をデバッグなしで実行してみるかのどちらかから始めるのがよいと思いますよ。


引用返信 編集キー/
■42785 / inTopicNo.4)  Re[2]: デバッグモードとリリースモードの違い
□投稿者/ ようすけ (2回)-(2009/10/21(Wed) 12:26:07)
No42781 (とっちゃん さん) に返信
> ブレークポイントを張らずにデバッグ版を実行してもそうなりますか?
> また、デバッグ実行しない場合も同様でしょうか?
>
> 同じ現象になるかどうかを確認する場合は、まずは可能な限り同じ条件で実行することです。
> 今回の場合、リリース版でも同じ位置にブレークポイントを置いてデバッグ実行してみるか
> デバッグ版をデバッグなしで実行してみるかのどちらかから始めるのがよいと思いますよ。

デバッグ版をデバッグなしで実行した時はリリース版と同じ動きをします。

デバッグ版で不具合原因箇所にブレークポイントを置かずにデバッグ実行した時もリリース版と同じ動きです。
(不具合とは直接関係のないところにはブレークポイントを置いている状態)

ListItemのSelectedプロパティの値がどう変化するか見たくてブレークポイントを置いて実行すると
リリース版とは違う動きになります。

頭が混乱します。
引用返信 編集キー/
■42786 / inTopicNo.5)  Re[2]: デバッグモードとリリースモードの違い
□投稿者/ ようすけ (3回)-(2009/10/21(Wed) 12:27:31)
ありがとうございます。
そういう考え方もあるんですね。参考になります。

No42780 (はつね さん) に返信
>>おそらく、本来エラーとなるはずなのに、なぜリリースモードで実行した時の
>>最初の初期化はエラーになっていないのかを知りたいのだと思います。
>
> 配列とかコレクションの範囲チェックとか、何かリリースモードでは処理速度の
> 向上のために実害がでるまでチェックしていないチェックの差なんじゃないで
> しょうか(推測、未確認)。
>
引用返信 編集キー/
■42793 / inTopicNo.6)  Re[3]: デバッグモードとリリースモードの違い
□投稿者/ とっちゃん (423回)-(2009/10/21(Wed) 14:04:17)
とっちゃん さんの Web サイト
No42785 (ようすけ さん) に返信
> デバッグ版をデバッグなしで実行した時はリリース版と同じ動きをします。

デバッグなしで実行した場合は同じ動作をするのですね?

では、ブレークポイントを張らずにデバッグ実行した場合はどうなるでしょう?
もちろんステップもせず、単にF5で実行しただけの場合です。



> ListItemのSelectedプロパティの値がどう変化するか見たくてブレークポイントを置いて実行すると
> リリース版とは違う動きになります。

Selected プロパティの変化をみるためにデバッガで追いかけているのですよね?
ウォッチウィンドウなどを利用して参照しながら。。。

リリース版で同じことをしてみましたか?
リリース版でもF5を押せばデバッグできますし、ブレークポイントもセットできます。<PDB削ってなければ

リリース版と違う動きなのはプログラムではありませんよね?
そのあたりをまずはきちんと認識することをお勧めします。

引用返信 編集キー/
■42799 / inTopicNo.7)  Re[3]: デバッグモードとリリースモードの違い
□投稿者/ 自作 (5回)-(2009/10/21(Wed) 14:47:00)
No42785 (ようすけ さん) に返信
複数のイベントが起こっている状態でブレークポイントで処理を止めると、
本来のイベント発生(処理)順と変わることはあるのでは?

ブレークポイントで止まるとコードが選択されますので、実行画面が
アクティブで無くなり、フォーカスの動きが変わったり、
Select系の動きに影響が出ても不思議じゃない気はします。
初心者はメッセージボックスでデータを確認しようとしますが、あれも
挙動が変わりますね。

>ListItemのSelectedプロパティの値がどう変化するか見たくてブレークポイントを置いて
処理を止めないで標準出力とかに吐き出せばいいのでは?

引用返信 編集キー/
■42803 / inTopicNo.8)  Re[4]: デバッグモードとリリースモードの違い
□投稿者/ ようすけ (4回)-(2009/10/21(Wed) 15:01:56)
No42793 (とっちゃん さん) に返信

> デバッグなしで実行した場合は同じ動作をするのですね?
>
> では、ブレークポイントを張らずにデバッグ実行した場合はどうなるでしょう?
> もちろんステップもせず、単にF5で実行しただけの場合です。

今試してみたところ、リリース版とと同じ動きでした。
(つまり、最初の初期化ではエラーにならず別画面から戻ってきた時の初期化でエラーが発生する)


> Selected プロパティの変化をみるためにデバッガで追いかけているのですよね?
> ウォッチウィンドウなどを利用して参照しながら。。。
>
そのとおりです。

> リリース版で同じことをしてみましたか?
> リリース版でもF5を押せばデバッグできますし、ブレークポイントもセットできます。<PDB削ってなければ

リリース版でのデバッグの仕方があっているかわかりませんが、以下の方法でやってみました。
プロジェクトのプロパティを開きリリース版のときの「デバッグ情報の生成」をtrueにし、
ブレークポイント置いて、F5 で実行したところブレークポイントで止まりました。(Visual Studioは2003です)

この場合、Selected プロパティの変化をみるためにF10でステップインしながらだと、デバッグ版でステップインしながらと同じ動きです。
ステップインしない(ブレークポイントを置かない)と本来のリリース版の動きをします。

つまり、
デバッグ版でもリリース版でも、Selected プロパティの変化をみるためにF10でステップインしながらだと、1回目の初期化時点でエラーになります。
逆にステップインしなければデバッグ版でもリリース版でも1回目の初期化ではエラーが発生せず、別画面から戻ってきた時の初期化でエラーがでます。

> リリース版と違う動きなのはプログラムではありませんよね?
ごめんなさい。意味がわかりませんでした。

もともとのコーディングがおかしくて、そこを直せば解決するんだからいいじゃん
という思いも少々あるのですが、仕方ありませんね・・これも勉強です。
根本的な原因まで追究する気はありませんが、「おそらくこうではなかろうか」という説明が出来ればと思っています。
引用返信 編集キー/
■42852 / inTopicNo.9)  Re[5]: デバッグモードとリリースモードの違い
□投稿者/ とっちゃん (426回)-(2009/10/22(Thu) 12:00:02)
とっちゃん さんの Web サイト
No42803 (ようすけ さん) に返信

>>リリース版と違う動きなのはプログラムではありませんよね?
> ごめんなさい。意味がわかりませんでした。
>
前後全部カットしましたが、違っていたのはプログラム自身の動きではない部分にありますよね。
同じ条件で実行すれば、リリース版でもデバッグ版でも同じ個所でエラーが発生するというのは
ご自身で調査して確認してもらいました(わざわざ確認してもらったわけですがw)。


そこから導き出せるのは、「デバッガでステップ実行した場合」と「そうではない場合」では
動作が異なることがあったということです。



デバッガでステップ実行している場合は、どれがどのようなプログラムであろうと少なからず副作用を受けます。

変数を表示するエリアに式を書くこともできます。
その式がデバッガからプログラムに影響を与え、結果として違う結果をもたらすということもありますし
デバッガで変数の値を変更することもできます。

今回の場合は、Selected プロパティを参照した(内部的に先に行われてい待った)ため
発生するであろう箇所よりもずっと前の段階でエラーが発生してしまったということになります。

プロパティによる取得は、フィールドの直接参照と違いコードの実行を伴います。
#.NET Framework は一時的にそのオブジェクトをデバッガで操作して値を導き出すという仕組みを持っています

そのため、今回のようにエラーが発生してしまうことも起こりえるということになります。
結論だけでいえば、プログラム的にループ中にSelected プロパティを参照するようにしておけば
同じくループ内でエラーが発生してしまうことになると思います。

くどくどと書いていますが、結構重要なことですので、是非とも覚えておいてほしいと思います。

引用返信 編集キー/
■42865 / inTopicNo.10)  Re[6]: デバッグモードとリリースモードの違い
□投稿者/ ようすけ (5回)-(2009/10/22(Thu) 13:39:47)
> くどくどと書いていますが、結構重要なことですので、是非とも覚えておいてほしいと思います。

ご説明ありがとうございました。
知識が増やせるよう頑張りたいと思います。

自分なりにまとめて説明してみます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -