DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ビルドした実行ファイルを実行すると、ハンドルされていない例外が発生

環境/言語:[Win2k VB.NET]
分類:[.NET]

お世話になります。どこから手を付けて良いかわからず途方にくれてしまいました。
先輩方からのご教授をいただけないでしょうか。宜しくお願いします。

問題点:
作成したプログラムを、デバッグビルドでテスト実行すると、ビルドエラーなく
正常に機能したので、ツールバーからReleaseを選び、ビルドからソリューション
のビルド(Ctrl+Shift+B)を選択し、実行ファイルを作りました。 

ところが、[bin]フォルダ内の実行ファイルをダブルクリックすると、
Microsoft .NET Framework の 小ウィンドウが現れて停止してしまいます。
ちなみに、プログラムでファイル読書きしますが、ファイルパスはドライブ名から
指定しています。

また、HTTPサーバーからデータを受信する部分もありますが、
Try〜Catchステートメントを使って、実行エラーでプログラム自体が停止せずに
回避できるようにしてあります。

問題点まとめ:
1.ビルドした実行ファイルを実行すると、ハンドルされていない例外が発生
2.JITデバッグとは何だ(私が勉強不足なのですが)
3.『low surrogateを後ろに伴わない high surrogate charが見つかった』の意味が不明
4.『Encodingにないか、有効な Unicode(UTF-16)文字が含まれていません』の意味も不明

[Microsoft .NET Framework]小ウィンドウの内容:

アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。
…略…
インデックス : 76で、low surrogateを後ろに伴わない high surrogate charが見つかりました。
入力がこの Encodingにないか、有効な Unicode(UTF-16)文字が含まれていません。
パラメータ名 : chars
* [詳細][続行][終了]の3個のボタンがありました。

----- ↓詳細内容 ---- ここから

このダイアログ ボックスではなく、Just-In-Time (JIT) デバッグを呼び出すための詳細については、
このメッセージの最後を参照してください。

************** 例外テキスト **************
System.ArgumentException: インデックス : 25 で、high surrogate に先導されない low surrogate char が見つかりました。入力がこの Encoding にないか、有効な Unicode (UTF-16) 文字が含まれていません。
パラメータ名 : chars
at System.Text.UTF8Encoding.GetBytes(Char* chars, Int32 charIndex, Int32 charCount, Byte[] bytes, Int32 byteIndex, UTF8Encoder encoder)
at System.Text.UTF8Encoding.GetBytes(Char[] chars, Int32 charIndex, Int32 charCount, Byte[] bytes, Int32 byteIndex, UTF8Encoder encoder)
at System.Text.UTF8Encoder.GetBytes(Char[] chars, Int32 charIndex, Int32 charCount, Byte[] bytes, Int32 byteIndex, Boolean flush)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Write(Char[] buffer, Int32 index, Int32 count)
at System.IO.TextWriter.WriteLine(String value)
 …長いので略…
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

************** 読み込まれたアセンブリ **************
mscorlib
アセンブリ バージョン : 1.0.5000.0
Win32 バージョン : 1.1.4322.2032
コードベース : file:///c:/winnt/microsoft.net/framework/v1.1.4322/mscorlib.dll
----------------------------------------
 …長いので略…
----------------------------------------
System.Windows.Forms.resources
アセンブリ バージョン : 1.0.5000.0
Win32 バージョン : 1.1.4322.573
コードベース : file:///c:/winnt/assembly/gac/system.windows.forms.resources/1.0.5000.0_ja_b77a5c561934e089/system.windows.forms.resources.dll
----------------------------------------

************** JIT デバッグ **************
Just-In-Time (JIT) デバッグを有効にするには、
このアプリケーション、またはコンピュータ (machine.config) の構成ファイルの
jitDebugging 値を system.windows.forms セクションで設定しなければなりません。
アプリケーションはまた、デバッグを
有効にしてコンパイルされなければなりません。

例 :

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

JIT デバッグが有効なときは、このダイアログで処理するよりも、ハンドルされていない例外はすべて

コンピュータに登録された JIT デバッガに設定されなければなりません。

----- ↑詳細内容 ---- ここまで
> at System.IO.TextWriter.WriteLine(String value)
>  …長いので略…

ここの後にあろうメソッドで発生してるので原因は絞り込めるでしょ?
ご指摘ありがとうございます。
悲しいかな私のレベルは、そのご指摘内容よりも低いものです。

疑問ですが、そもそも、デバッグビルドでエラー無く問題なく機能するプログラムが、
リリースビルドして作成した実行ファイルを実行するとエラー発生しちゃうって
ことが、ありえるのでしょうか? 何のためのデバッグビルドでしょうか…。


■No10904に返信(はいこーんさんの記事)
>>at System.IO.TextWriter.WriteLine(String value)
>> …長いので略…
>
> ここの後にあろうメソッドで発生してるので原因は絞り込めるでしょ?
> 疑問ですが、そもそも、デバッグビルドでエラー無く問題なく機能するプログラムが、
> リリースビルドして作成した実行ファイルを実行するとエラー発生しちゃうって
> ことが、ありえるのでしょうか? 何のためのデバッグビルドでしょうか…。

普通にありえます。多分、認識にずれというか、誤解があります。

デバッグビルドには問題を検出するための機能が多々組み込まれていますが、
同時にこれが安全弁にもなって、一見エラーに見えなかっただけで、
リリースビルドと同じバグを抱得ています。

リリースビルドは、デバッグビルドで問題が全て解決された前提で動作するため、
ちょっとしたバグで落ちたりします。そのかわりに、実行効率がよいです。

デバッグビルドは、問題を解決するため、デバッグするための設定であり、
落ちた後に活躍するのがデバッグビルドであって、
リリースビルドで落ちないプログラムが正しいプログラムです。
動作の確認は実際のリリースビルドで行うのが普通だと思います。
■No10905に返信(UEHARAさんの記事)
> ご指摘ありがとうございます。
> 悲しいかな私のレベルは、そのご指摘内容よりも低いものです。

会話になっていないような(^^;

はいこーんさんの指摘されている
>at System.IO.TextWriter.WriteLine(String value)
> …長いので略…

この「長いので略」と書かれているところが、
原因の一旦であることは間違いないのに、
肝心の部分が略されてしまっているので、アドバイスができません。

#他の要因もいろいろありそうなので、このスタックとレースがあっても、
#的確にアドバイスするのは非常に難しいです。

> 疑問ですが、そもそも、デバッグビルドでエラー無く問題なく機能するプログラムが、
> リリースビルドして作成した実行ファイルを実行するとエラー発生しちゃうって
> ことが、ありえるのでしょうか? 何のためのデバッグビルドでしょうか…。

いろいろな要因でそういうことは発生しますが、
たいていの場合は、作成者本人は差異がないと思っているだけで、
実際は差異があるというのが多いです。
例えば、デバッグビルドでのみ動くようなユーザ環境固有の情報を
入れてしまっている場合があります。また実行手順が違う場合もありますね。

リリースビルド、デバッグビルドという以外では、
実行環境も実行手順もまったく同じなのでしょうか?
違う部分を探してみましょう。
■No10903に返信(UEHARAさんの記事)
> 3.『low surrogateを後ろに伴わない high surrogate charが見つかった』
> の意味が不明

surrogate というのは、CLR 文字列型の内部表現である UTF-16 で、U+10000
から U+10FFFF までの文字を表現するために使われる仕掛けです。一文字分の
16 bit では表現できない文字を表現するために、二文字分を使って表現する
わけです。その二文字を、high と low で区別するんですね。

エラーメッセージの意味は要するに、文字列として扱おうとしたデータが、正
しい文字列データではなかったということでしょう。

詳しいことが分からないので全くの勘ですが、HTTP サーバからの間欠的な受
信に関連して、文字列データとしては不可分であるべき byte 列が泣き別れに
なっている、なんてどうでしょう。ビルドの違いによって、受信の境界が不可
分な byte 列にかかったり、かからなかったりすると。

DOBON.NET | プログラミング道 | プログラミング掲示板