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

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

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

Re[18]: 「エラー内容をMicrosoftに送信しますか?」について


(過去ログ 40 を表示中)

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

■20993 / inTopicNo.1)  「エラー内容をMicrosoftに送信しますか?」について
  
□投稿者/ RX-8 (2回)-(2008/06/23(Mon) 11:30:58)

分類:[.NET 全般] 

<開発環境>
WindowsXP pro sp2
VS2005pro C#

自作のアプリケーションを動作中に突然、
「エラー内容をMicrosoftに送信しますか?」というようなエラーが発生しました。
再現性はありません。
実はこの問題についてはすでに解決済です。
VSのデバッガで実行したら例外をキャッチできたのが幸いしました。
質問というのはデバッガでキャッチできた例外がなぜリリースしたプログラムだとこのようなエラーになるかです。
今までですと、リリースしたものでも例外エラーを出てたのにどうして今回に限って・・・
と気になってしょうがない状況です。


<原因>
マルチスレッドプログラムでコントロールのウィンドウハンドルを作成せずに、
外部スレッドからそのコントロールにアクセスしたためです。
も少し詳細にいうと、
一度も表示されていないListBoxのアイテムコレクションを複数のスレッドが操作してたんですが、
絶妙なタイミングであるスレッドが削除中のアイテムに別スレッドがアクセスしたためです。

引用返信 編集キー/
■20994 / inTopicNo.2)  Re[1]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ ネタ好き (479回)-(2008/06/23(Mon) 11:43:06)
No20993 (RX-8 さん) に返信
すみません。質問内容が分からないのですが・・・
引用返信 編集キー/
■20996 / inTopicNo.3)  Re[2]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ RX-8 (3回)-(2008/06/23(Mon) 12:03:59)
No20994 (ネタ好き さん) に返信
> ■No20993 (RX-8 さん) に返信
> すみません。質問内容が分からないのですが・・・

ネタ好きさんこんにちは。

>質問というのはデバッガでキャッチできた例外がなぜリリースしたプログラムだとこのようなエラーになるかです。

.NET Framework上で発生した例外はデバッガなしでも例外エラーとしてその内容が表示されますよね?
今回の例ですと、デバッガなしの場合にタイトルにあるようなエラーになってしまい、原因究明に困りました。
でもデバッガを仕込んで実行したらちゃんと例外をキャッチしてくれました。
じゃぁ、デバッガなしで例外エラーが出ないのはなぜと思った次第です。
#OS内部で起こったエラーだから?いやでもデバッガでキャッチでk・・・
引用返信 編集キー/
■20998 / inTopicNo.4)  Re[3]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ Jitta on the way (118回)-(2008/06/23(Mon) 12:22:58)
No20996 (RX-8 さん) に返信

私も、なにが聞きたいのか、イマイチ、ピンとこない。


リリースモードとデバッグモードの、実行ファイルのサイズを比べて見てください。あと、プロジェクトの細かいオプションも。


それとも、「一回きり」が主なのだろうか?


あるいは、エラー報告の画面がでたことが問題なのだろうか?
引用返信 編集キー/
■21000 / inTopicNo.5)  Re[3]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ みきぬ (2回)-(2008/06/23(Mon) 12:34:39)
・PCにVisualStudioがインストールされている → デバッガを起動するかどうか聞かれる
・PCにVisualStudioがインストールされていない → エラー報告ダイアログが出てくる
ということではないかな、と予想しました。
引用返信 編集キー/
■21003 / inTopicNo.6)  Re[4]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ RX-8 (4回)-(2008/06/23(Mon) 13:31:01)
No20998 (Jitta on the way さん) に返信
>リリースモードとデバッグモードの、実行ファイルのサイズを比べて見てください。あと、プロジェクトの細かいオプションも。
サイズは同じでした。細かいオプションを調べましたが、エラー報告の形式に影響を与えているオプションが見つかりませんでした。
#見落とし?
ただ、わざと例外が発生する仕組みにしてリリースしたものを実行した場合、
ちゃんとMicrosoft .NET Frameworkの「ハンドルされていない例外が発生しました」というメッセージが表示されますので、
その辺りに原因があるとは思えません。


>それとも、「一回きり」が主なのだろうか?
>あるいは、エラー報告の画面がでたことが問題なのだろうか?

特に何も問題はありません。
例外がちゃんと発生しているのに「ハンドルされていない例外が発生しました」が出ないのはなぜだろうと思っただけです。

No21000 (みきぬ さん) に返信
>・PCにVisualStudioがインストールされている → デバッガを起動するかどうか聞かれる
>・PCにVisualStudioがインストールされていない → エラー報告ダイアログが出てくる
開発環境でも下記の方の形式のエラー報告が出ますので、今回のはエラーは開発環境のありなしは関係なさそうです。
引用返信 編集キー/
■21004 / inTopicNo.7)  Re[5]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ みきぬ (3回)-(2008/06/23(Mon) 14:04:47)
[コントロールパネル]→[システム]→[詳細設定]タブ→[エラー報告]ボタン
の設定の違いは関係ありますか?
引用返信 編集キー/
■21009 / inTopicNo.8)  Re[6]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ RX-8 (5回)-(2008/06/23(Mon) 15:07:54)
No21004 (みきぬ さん) に返信
> [コントロールパネル]→[システム]→[詳細設定]タブ→[エラー報告]ボタン
> の設定の違いは関係ありますか?

そこをOFFにすると無言でアプリが落ちます。
ONにするとマイクロソフトへ送信云々のダイアログが出ます。
知りたいこととは関係ない気がします。
引用返信 編集キー/
■21016 / inTopicNo.9)  Re[7]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ RX-8 (6回)-(2008/06/23(Mon) 16:12:54)
エラー送信しますか?ダイアログの出し方についてミニマムコードを提示しておきます。

@Windowsアプリケーションを作成します。
AForm1にListBoxを一つ配置し、コードを以下のように編集します。
static class Program
{
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form1 form = new Form1();
        Application.Run(); // フォームを表示しない
    }
}

public partial class Form1 : Form
{
    delegate void AddDelegate();

    public Form1()
    {
        InitializeComponent();
        System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Worker));
        thread.Start();
    }

    private void Add()
    {
        listBox1.Items.Add("アイテム");
    }

    private void Worker(object o)
    {
        this.Invoke(new AddDelegate(Add));  // デバッグモードだとここで"ウィンドウハンドル作成されてないよ"と例外
    }
}

Bリリースしたexeファイルを実行します。

#.NET Frameworkのエラーが出てくれた方が原因究明がしやすいと思うんですがね。

引用返信 編集キー/
■21019 / inTopicNo.10)  Re[8]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ みきぬ (4回)-(2008/06/23(Mon) 17:07:17)
再現手順を実行してみたのですが、私の環境だとどちらの場合も Visual Studio Just-In-Time デバッガのウインドウが表示されますねぇ…。
おそらく、RX-8さんのPCではVisual Studio上からでないとデバッガが起動しないようになっているのだと思いましたが、その原因まではわかりません。

もしかすると、↓のあたりが参考になるかもしれません。
http://msdn.microsoft.com/ja-jp/library/5hs4b7a6(VS.80).aspx
引用返信 編集キー/
■21026 / inTopicNo.11)  Re[9]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ RX-8 (7回)-(2008/06/23(Mon) 18:26:18)
No21019 (みきぬ さん) に返信
> 再現手順を実行してみたのですが、私の環境だとどちらの場合も Visual Studio Just-In-Time デバッガのウインドウが表示されますねぇ…。
> おそらく、RX-8さんのPCではVisual Studio上からでないとデバッガが起動しないようになっているのだと思いましたが、その原因まではわかりません。
>
> もしかすると、↓のあたりが参考になるかもしれません。
> http://msdn.microsoft.com/ja-jp/library/5hs4b7a6(VS.80).aspx

どちらの場合でもってのが気になったので確認なんですが、
リリースモードで実行ではないですよ。リリースモードでコンパイルしたexeファイルを直(ダブルクリック)で起動ですよ?

とりあえず、上記を参考にしてみます。ありがとうございます。

引用返信 編集キー/
■21028 / inTopicNo.12)  Re[10]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ Jitta on the way (119回)-(2008/06/23(Mon) 18:48:39)
No21026 (RX-8 さん) に返信

JIT なので、必要になったとき、ですね。

環境(いろんな意味で)に依存していると思いますよ。
引用返信 編集キー/
■21031 / inTopicNo.13)  Re[11]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ RX-8 (8回)-(2008/06/23(Mon) 19:09:35)
No21019 (みきぬ さん) に返信
> 再現手順を実行してみたのですが、私の環境だとどちらの場合も Visual Studio Just-In-Time デバッガのウインドウが表示されますねぇ…。

あ、追記になりますが、開発環境がありますので"エラーを送信しますか?"ダイアログにデバッグボタンがありまして、
それでデバッグを行うことができます。

■No21028 (Jitta on the way さん) に返信
> ■No21026 (RX-8 さん) に返信
> 
> JIT なので、必要になったとき、ですね。
> 
> 環境(いろんな意味で)に依存していると思いますよ。

環境なんですかね、何かスレッド周りに関係している気がするのですが・・・
というのも少し例えは変わりますが、(今度は起動時に表示される)フォームにボタンを一つ配置して
private void button1_Click(object sender, EventArgs e)
{
    System.IO.File.Open("存在しないファイル", System.IO.FileMode.Open);
}

上記のようにしたときと、

private void Worker(object o)
{
    System.IO.File.Open("存在しないファイル", System.IO.FileMode.Open);
}
private void button1_Click(object sender, EventArgs e)
{
    System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Worker));
    thread.Start();
}

のようにしたときではエラーの表示のされ方が違う気がするのですが・・・。
(リリースしたexeをダブルクリックで起動です)

こちらでは生成した二つのexeファイルを複数のマシンで実行確認しましたが、
やはり後者は"エラーを送信しますか?"みたいになります。

引用返信 編集キー/
■21035 / inTopicNo.14)  Re[10]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ みきぬ (5回)-(2008/06/23(Mon) 19:43:35)
No21026 (RX-8 さん) に返信
> どちらの場合でもってのが気になったので確認なんですが、
> リリースモードで実行ではないですよ。リリースモードでコンパイルしたexeファイルを直(ダブルクリック)で起動ですよ?
>
そうです。念のためexeファイルだけ別のフォルダへ移してから実行してもみましたが、

// ここから
Visual Studio Just-In-Time デバッガ

ハンドルされていない例外('System.InvalidOperationException')が
WindowsApplication2.exe [2524]で発生しました。

利用可能なデバッガ───────
新しいインスタンス Microsoft CLR Debugger 2003
新しいインスタンス Microsoft CLR Debugger 2005
新しいインスタンス Visual Studio .NET 2003
新しいインスタンス Visual Studio 2005

□現在選択されているデバッガを規定のデバッガに設定する(D)
□デバッグ エンジンを手動で選択する(M)

選択したデバッガを使ってデバッグしますか?
[はい(Y)] [いいえ(N)]
// ここまで

というダイアログが表示されました。
# 画面を貼れないなりになるべく再現してみました


Microsoft CLR Debugger 2005 でデバッグしてみると、追加情報で「追加情報: ウィンドウ ハンドルが作成される前、コントロールで Invoke または BeginInvoke を呼び出せません。」と出ましたから、おそらく間違いないと思います。
引用返信 編集キー/
■21050 / inTopicNo.15)  Re[11]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ Jitta on the way (120回)-(2008/06/24(Tue) 07:45:29)
No21035 (みきぬ さん) に返信

スレッドがらみのエラーですか。
今、バインドする dll がらみのエラーが発生しているので、開発環境を含めた「環境依存」かと思いました。
引用返信 編集キー/
■21051 / inTopicNo.16)  Re[12]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ ネタ好き (481回)-(2008/06/24(Tue) 08:32:37)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebugレジストリキーの値が関係していると思います。
引用返信 編集キー/
■21058 / inTopicNo.17)  Re[13]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ RX-8 (9回)-(2008/06/24(Tue) 10:10:07)
No21051 (ネタ好き さん) に返信
> HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebugレジストリキーの値が関係していると思います。

上記は1になっていますので問題ないと思います。

ついでに■21031の実行結果を張っておきます。
前者
ttp://imagepot.net/view/121426873313.png
後者
ttp://imagepot.net/view/121426873621.png
デバッグボタンを押すとみきぬさんのおっしゃっているような画面になります。
開発環境のないパソコンで実行するとデバッグボタンはありません。
ですので、エラーの情報が全くなくて原因を探るのに困ります。
・・・と思っていましたが、''この報告に含まれるデータの参照''を確認すれば
例外の種類ぐらいは特定できそうなので良しとしますかね。

根本的な疑問であるエラー表示の違いについては不明瞭なままですが、
環境依存もありそうなので今一度見渡して自分の中で整理することにします。
ありがとうございました。
解決済み
引用返信 編集キー/
■21082 / inTopicNo.18)  Re[14]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ RX-8 (10回)-(2008/06/24(Tue) 16:11:28)
いろいろ試した結果、
.NET Frameworkが出すエラーはUIスレッド(メインスレッド)で
例外が起きたときに表示されることがわかりました。
対して、マイクロソフトへの送信を促すエラーはWokerスレッドで
例外が起きたときに表示されることがわかりました。

なぜ後者が.NET Frameworkエラーにならないかというと、
そのエラーダイアログへのウィンドウハンドルを持っていないからだと考えます。
なぜウィンドウハンドルを持っていないかというと、
UIスレッド以外のスレッドは動的に生成されるためだと思います。
(じゃぁ生成したときに共有すりゃいいじゃんって話になりそうですがね)
このように.NET Framework上のエラーとして通知できないため、
そのエラーは終着点であるOSのエラーとして処理されるのではないでしょうか。

ちなみに、WokerスレッドでInvokeすりゃUIスレッドで処理してくれる?と思いましたが、
Invoke先で発生した例外はInvoke元に戻ってくるようで、
結果としてWokerスレッドで検知されることになり、
これまたマイクロソフトへの送信エラーとなるようです。

じゃぁ、結局このマイクロソフトへの送信エラーをなくすためにはどうしたらいいかというと、
Wokerスレッドで発生した例外をUIスレッドになんとか通知して(できるの?)
そこで再度例外をスローすればいいかなと思うわけですが、
それじゃぁ例外発生の可能性を見越して実装しているわけで、
それが完璧にできるなら苦労しないわけで・・・
つまり実行するスレッドを意識してがんばって実装しないとどうしようもないということになりますね。
なむ

ソースがないので根拠とはなりませんが、自分なりの結論を書いておきます。
間違っている場合はご指摘お願いします。
解決済み
引用返信 編集キー/
■21084 / inTopicNo.19)  Re[15]: 「エラー内容をMicrosoftに送信しますか?」について
□投稿者/ 渋木宏明(ひどり) (793回)-(2008/06/24(Tue) 16:27:12)
渋木宏明(ひどり) さんの Web サイト
> Wokerスレッドで発生した例外をUIスレッドになんとか通知して(できるの?)

例外の捕捉だけなら、AppDomain.UnhandledThreadException でできませんか?

> つまり実行するスレッドを意識してがんばって実装しないとどうしようもないということになりますね。

ウィンドウ関連の操作が伴う場合、それは絶対条件です。
COM を扱う場合なんかにも同じようなもんです。

引用返信 編集キー/
■21087 / inTopicNo.20)  Re[16]: 「エラー内容をMicrosoftに送信しますか?」について
 
□投稿者/ RX-8 (11回)-(2008/06/24(Tue) 16:51:49)
No21084 (渋木宏明(ひどり) さん) に返信
>>Wokerスレッドで発生した例外をUIスレッドになんとか通知して(できるの?)
>
> 例外の捕捉だけなら、AppDomain.UnhandledThreadException でできませんか?

ありがとうございます。AppDomain.UnhandledExceptionってやつですよね?
試した結果補足できました。
ただ、これは補足するだけで例外を握りつぶすようなことはできないようで、
その後エラーは出てしまいますね。
補足だけならってそういう意味ですかね?


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

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -