none
単純なファイルダイアログ表示コードでほぼ確実にハングしOSも制御不能となる。 RRS feed

  • 質問

  • はじめまして

    古いスレッドにもかかわらず深刻な問題のため投稿させていただきました。

    開発環境:
    OS: Windows7 Home Edition 64bit
    Visual Studio 2010 C# Express 
    (先ほど別スレッドで誤って2008と記載してしまいましたが正しくは2010になります。)

    事象:
     以下のような単純にファイルダイアログを表示してパスを取得するコードなのですが、
     ほぼ9割の確率でハングします。 しかも次第にあらゆるプログラムが応答なしとなり
     最終的にはOSも制御不能の状態になります。
     この状態になるまで数秒程度です。 
     シャットダウンすら不能なためPCの電源ボタン長押しでしか対処方法がなくなります。
     過去事例で解決策があればお教えいただけますでしょうか?

            private void button1_Click(object sender, EventArgs e)
            {
                try {
                    this.openFileDialog1.Filter = "CSVファイル(*.csv)|*.csv";
                    if (this.openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
                        this.textBox1.Text = this.openFileDialog1.FileName;
                    }
                    else {
                    }

                }
                catch (Exception ex) {
                    MessageBox.Show(ex.Message);
                }
            }

    ※追記※
    このスレッドを使用するのは初めてなのですが
    返信を投稿してもこのスレッド画面上に表示されないようです。
    引用で行う必要があるのでしょうか?

    >佐祐理さん
    もしかして何度も返信メールが送られていたらごめんなさい。
    上記のような理由で誤って送信されている状況です。
    もし送信されていないとすれば返信内容は反映されず揮発してしまったのかも
    ・・みたいなことになっているようです。

    以下に本題の続きを記載します。

    ハングアップが発生する条件ですが
    IDEにてデバッグ実行で画面を表示後、ボタンクリックから
    実行されるコードのopenFileDialog1.showDialog()の実行時にハングが
    始まります。
    画面に張り付けたコントロール以外にもnew で当該オブジェクトのインスタンス生成
    においても同様の結果となり、またVB.netにて同等のコードを記載して実行時にも
    まったく同じ事象となります。

    リソースモニターにて監視していると、ハングの際には必ずvshost.exeが
    真っ赤に表示され、IDEから実行なので当然なのかもですが、いかにも
    ハングの影響を受けてますよ的になっています。

    ちなみに、リビルド時にDebugフォルダー以下に作成されるバイナリ実行ファイル(exe)
    を実行した場合にはハングせず正常に動作します。※その他のアプリケーション(Excel/Wordなども正常に動作しています)

    • 編集済み sena0824 2012年7月9日 14:19
    2012年7月8日 16:28

すべての返信

  • コードを見る限り問題ありません。

    何をしたときに「ハングしま」すか?

    1. このプログラムを起動したとき
    2. button1をクリックしたとき
    3. openFileDialog1でなんらかの操作をしたとき
    4. openFileDialog1でOKをおしたとき
    5. そのた

    この説明が抜けていますし、そのときこそが問題個所と思います。

    また、他のPCで再現しますか? しないのならハングするPCの環境問題であり再インストールで改善する可能性があります。

    • 回答の候補に設定 山本春海 2012年7月17日 7:20
    2012年7月8日 22:56
  • 前のスレッドの問題では、開くダイアログの表示対象が仮想フォルダの場合にのみ起こる現象であることが確認されています。

    問題の発生している上記の処理では、仮想フォルダを表示しようとされていますか? Windows 7 とのことですが、これは開発環境ですか?実行環境ですか?(Windows 7 のデフォルトは個人設定によるのですが、たしか標準の開くダイアログはライブラリ未対応だったと思ったので。。。)

    また、ためしに InitialDirectory になんらかのパスを設定して仮想フォルダを開かないようにして現象が回避できるか確認してみるとよいかもしれません。これで解消するのであれば、GetSpeficalFolder なんかを利用して物理パスを設定するというのも手です。

    2012年7月9日 3:34
  • 前のスレッドにも書かれていましたが、ほかのソフトでは正常に動作しますか?

    そして、Win32APIを直接呼んだ場合はどのような動作を示すでしょうか。

    ただ、OSを巻き込んでクラッシュするということはあまりないはずなので、OSに問題がある可能性が高いのではないかと思います。

    私も一度OSの再インストールとを検討してみたほうがいいと思います。

    あとは、若干むずかしいですが、ILSpyというソフトでOpenFileDialogの中の処理にまでステップインすることができます。

    できるようであれば、これを使ってどの部分でハングアップするのか確認してみるといいかもしれません。

    http://sourceforge.jp/projects/sfnet_sharpdevelop/releases/

    必要なデバッグ機能はまだ不安定ということで最新版では削られています。

    少し前のバージョンなら含まれているので上のアドレスの[ILSpy]=>[2.0]=>[ILSpy_Master_2.0.0.1564_Beta_Binaries.zip]をダウンロードしてください。

    2012年7月9日 8:24
  • あくまで私の経験談です。ちゃんと検証したわけではありません。

    Win7/VS2008, WinXP/VS2008上で、MFCアプリをデバッグしているときに同じような現象に会ったことがあります。

    そのときは、Ctrl+Alt+Delからログオフを行うと、(極めてゆっくりとですが)一つずつプロセスが強制終了されていき、devenv.exeが終了した時点からプロセス終了速度が普通の状態に戻り、最終的にログオン画面に戻りました。

    このことから、OSではなくシェルがハングしていると推測しました。また、悪さをしているのはデバッガ(devenv.exe)であろうというのは明らかでした。

    で、後ろ向きな回避策として、グローバルキーフックで適当なキーにdevenv.exeの強制終了を割り当てる常駐アプリを作っていました。

    2012年7月9日 9:59
  • みなさま
    いろいろ投稿いただき有難うございます。

    補足情報として事象発生までの時系列での説明をいたします。

    ・IDEからデバッグ実行
    ・画面起動後にボタンクリック
    ・openFileDialog1.showDialog()実行時にハングが始まる。
    ・すぐにIDEもハングし、マウスで触る場所がすべて応答なしとなっていきます。
    ・最終的にはマウスもキーボードもなにも操作不可能な状況となり
    ・PCの長押しで強制シャットダウンのみが最後の手段となります。

    ハング時の状況をリソースモニターでみているとvshost.exeが真っ赤になり
    ハングと関係しているのかのように見えました。
    ただ単にハングの影響を受けているだけなのかも知りませんが。

    実は別途VB.netでも同等のソースにてデバッグ実行にて確認してみたところ
    まったく同じ事象となりました。

    ちなみに
    リビルド時にDebugフォルダー以下に作成されるバイナリ(exe)を直接
    実行の際にはハングせず正常に動作します。

    その他のアプリケーション(IE、Explorer、Excel、Word・・etc)でのファイルを開く
    ダイアログはすべて普通に使えています。

    以上となります。
    なにか解決の糸口が見つかると良いのですが。

    宜しくお願い致します。

    2012年7月9日 14:08
  • 直接の解決策ではありませんが、生成した EXE や他のアプリケーションでOpenDialogに問題ないのなら、Visual Studio の再インストールをお勧めします。

    あと強制シャットダウンしないと操作できなくなるというのも気になるところです。ハードウェアの構成はどうなってますか?


    ひらぽん http://d.hatena.ne.jp/hilapon/

    2012年7月9日 14:41
    モデレータ
  • 私も昨日ダイアログを開いたところでハングするというのを体験しました。

    はっきりと手順を覚えているわけではないのですが、同様に電源ボタンを長押しするしかなくなりました。

    十分検証していないのですが、google driveをインストールするとExploreの動作がおかしくなるように思います。

    アンインストールした今は現象が起こっていません。他にドライブの最適化もしましたのでどちらが効いているのかあやふやです。

    これに該当していればよいのですが。


    http://systemartlaboratory.com/

    2012年7月14日 12:09
  • 初めまして。

    私も同じ現象を経験しました。
    OpenFileDialogBoxのプロパティで [ヘルプ]ポタンを表示する設定にすると正常に動作しました。

      this.openFileDialog1.ShowHelp = true;

    ただし、原因についてはよくわかりません。悪しからず。

    ※以下の記事を参考にしました。
      参考URL:http://wishmesh.com/2011/06/call-to-openfiledialog-or-savefiledialog-hangs-or-freezes/

    それにしても、OSごとハングするって深刻なことなのに、情報は少ないですね。

    2012年7月29日 12:13
  • 初めて書き込みます。

    私もOpenFileDialog、SaveFileDialogで、OS(Windows7)までハングしてしまって、10回以上、ブートしなおしました。使っているのは、VisualStudio2010 Express、VB.NET、Windows7です。Express版だからバグっているのでしょうか?
    しかし、OSまでハングさせるとは、あきれたバグですね。
    で、このWebページにたどり着いて、2つのコントロールのプロパティのShowHelpをtrueにしたら正常にファイルダイアローグが表示されました。

    デバッグに使った6時間を返してくれ、と言いたいところです。

    タダのExpressで何を文句言ってるんだ、という天下のマイクロソフトさんの声が聞こえてきますが。

    (しかし、正直言って、やはり、JAVAのほうが安定してるんでしょうね。)

    2012年9月9日 8:11
  • > しかし、正直言って、やはり、JAVAのほうが安定してるんでしょうね

    まったく関係ないところだけツッコミますが、じいさんさんはこのスレッドの文章と参照されているURLの記事の内容を読まれていますか?

    この問題は、Windows のスレッドアパートメントと、シェルのCOM関連の問題に関するものであろうことが推測されており、C++ でも C# でも Java でも発生することが確認されている問題です。少し読めばプログラム言語に依存した問題ではないということは理解できると思います。

    安定性面は用途次第なのでなんともノーコメント。

    > それにしても、OSごとハングするって深刻なことなのに、情報は少ないですね

    この問題が、非常にレアで再現性が低いからですね。

    雰囲気で・・・なのですが、Windows シェルを拡張する特定の常駐ソフト類をインストールしない限りは発生しないような印象はあります。インストールされているシェル拡張が、explorer.exe 以外から開かれた場合に想定していない状況になってシェルをハングアップさせているようにも見えますが、はっきりした感じではないのですよね。仮想フォルダの問題でも似たような初期化の問題でしたし、参考URLなんかを見てもうかがえます。

    MTA の explorer.exe からロードされているシェル拡張が、STA のアプリケーションの開くダイアログに同時ロードされた時に起こるとかでも、ヘルプボタンの表示で変わったりはそう簡単にはしないと思うんですけどね^^

    私の使っている TortoiseSVN というシェル拡張ツールの場合、ファイルを開くダイアログの中でも動作するかどうかを設定で選べたりします。このあたりは利便性を考慮した設計だと思いますが、もしかしたらこのスレッドで話題になっているようなハングアップの経験があって作った機能だったりするかもしれませんね。

    2012年9月12日 9:54
  • 私もこの現象に何年も前から悩まされていたのですが、

    雰囲気で・・・なのですが、Windows シェルを拡張する特定の常駐ソフト類をインストールしない限りは発生しないような印象はあります。インストールされているシェル拡張が、explorer.exe 以外から開かれた場合に想定していない状況になってシェルをハングアップさせているようにも見えますが、はっきりした感じではないのですよね。

    というお話を参考に、発生環境で利用するシェル拡張の数を減らしてみたところ、劇的に改善されました! 以前は百発百中に近かったのですが、今日は5~6回試して未だに発生していません。

    無効化したのはよく使っていたシェル拡張だったので不便にはなりましたが、OSごと固まるあの現象に見舞われることを考えると、許容できる範囲です。

    同じ現象に悩んでいる方は、一度試してみることをお勧めします。


    • 編集済み ozzychang 2012年10月25日 10:23
    2012年10月25日 10:23
  • Windowsの問題なのか、シェルの問題なのか、なんでもいいですが、結局、どうやったら解決できるんでしょうかね?

    私が知りたいのは、どうやったらハングせずにデバッグできるかなんですけどね。

    正直言いますと、能書きは不要ですので、解決策を教えてほしいですね。

    2013年1月1日 14:58
  • 正直言いますと、能書きは不要ですので、解決策を教えてほしいですね。

    万能な解決策はありません。
    「問題を引き起こしているツールを除去すること」が解決策として一番効果を期待しやすいという流れになっていますよね。

    「クリーンな OS を用意し、Visual Studio だけを入れた状態で作業すること(他のアプリケーション・ツール類は全く入れないことが前提)」が解決の早道だと思います。そこから、1つずつツールを入れていって起きるかどうかを切り分けていけば、通常環境に近づけることも可能でしょう。

    本筋としては、有償サポートを頼るべき事例に感じられます。
    理由としては、誰にでも再現可能な事例ではないこと(共存しているツールとの相性問題であり、そのツールが特定されていないこと)、現象のメカニズムが解明されていないので根本的な問題(原因)を対処する方法が知られていないことからです。
    そういった場合、Microsoft のエンジニアに協力してもらって原因を知り、デバッガのバグであれば Hotfix をリクエストする、あるいはバッティングしたツールを使用しないという風に解決するストーリーを期待したいところです。
    ただ、Express はサポート対象外だったはずなので、自分でできることをやってもらうしかない、詰まるところは「バッティングしているツールの特定と除去を自分でやる」だけかと思います。

    2013年1月1日 15:45
    モデレータ
  • 下記のファイルを削除して、解決しました。

    C:\Windows\System32\drivers\cymon.sys

    (自分の環境は: Dynabook Corei7 Windows7 64ビット)

    下記のWebに詳しい情報が掲載されています。

    http://jihi4541.blog.fc2.com/blog-entry-3.html

    2013年1月2日 3:07
  • セキュリティー関連のアプリは無茶やっているのが多いので、原因を調べるのが大変ですね。

    シェル拡張の件はかなり的を射ているような気がしますが、さすがにこの回答を現象が発生しない回答者に求めるのは無茶っぽいですよね。

    じいさんが提示されたURLの更に先にある「OpenFileDialogを表示するときにフリーズする原因の調査手順」はトラブルシュートの手順として素晴らしいですね。

    2013年1月3日 3:35
  • 初めまして.私も見事にこの問題に引っかかりました.結局のところ,「開発環境に電子書籍絡みのアプリのインストールは厳禁」,というのが現段階での現実的な解法になりそうですね.急激な電子書籍の普及により,過去からあった問題がより顕在化してきた,という感じでしょうか.

    しかしこれ,cymon.sysを開発しているサイファーテック株式会社に働きかければいいんですかね.出来ればマイクロソフトで対応してくれれば良いのですけれど,日本以外で顕在化してないトラブルな感じなのが何とも….


    • 編集済み Oa Ikeki 2013年1月24日 11:05
    2013年1月24日 11:04
  • しかしこれ,cymon.sysを開発しているサイファーテック株式会社に働きかければいいんですかね.出来ればマイクロソフトで対応してくれれば良いのですけれど,日本以外で顕在化してないトラブルな感じなのが何とも….

    Microsoft の責任範囲ではないので、Microsoft が対応することはないと思います。
    なぜなら、サードパーティーが勝手に作ったドライバーがクラッシュしているので、そのドライバーを作るメーカーが悪いと言うことになるため。
    (不具合のあるドライバーを Microsoft が検知して、それを回避するような OS の修正をすることはあり得ません。世の中にはかなりの数のドライバーがあるため、都度対処していては費用対効果に見合わないでしょうから)
    2013年1月24日 13:44
    モデレータ
  • はじめまして。

    私もVisualStudio2012を使用して、似たような症状に遭遇しました。

    私のほうはC++を使用していますが、デバッガをかけた状態でファイルダイアログを開くとハングしてしまうことがありました。

    似たような症状が報告されていないか探してみたところ、このようなものが見つかりました。

    http://connect.microsoft.com/VisualStudio/feedback/details/683168/find-in-files-dialog-causes-visual-studio-2010-to-crash

    ここで、報告されている解決策を試したところ、今のところハングすることはなくなりました。

    見当違いかもしれませんが、一応報告しておきます。

    2013年10月14日 15:19
  • あとでこれを読む人がいるかもしれないので書かせていただきます。

    【当方の開発環境】
    Windows10 Homeエディション
    OSビルド 19043.1415(64bit)
    Visual Studio 2022 Visual C# Compiler バージョン 4.0.1-1.21568.1 (6ab66011)

    皆さんと同様に
    OpenFileDialog opendlg = new OpenFileDialog();
    とやったところでダイアログボックスが出る前にハングアップしました。

    ※1 OSは制御不能にはなりませんでした。
    ※2 opendlg.ShowHelp = false; ではやはり応答なしになりました。
    ※3 スレッドにある cymon.sys なるドライバは当方の環境にはありませんでした。

    using System;
    using System.Windows.Forms;
    
    namespace WindowsOpenFileDialogApp
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                string[] filters = new string[]
                {
                    "テキスト文書|*.txt;*.htm;*.html",
                    "プログラミング|*.c;*.cpp;*.h",
                    "全てのファイル|*.*"
                };
                openFileDialog1.Title = "ファイルを開くサンプル";      // タイトルバーの文字列
                openFileDialog1.Filter = String.Join("|", filters);    //「ファイルの種類」を指定
    
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox1.Text = openFileDialog1.FileName;
                }
            }
        }
    }

    でもこのような短いプログラムではヘルプボタンもありませんが、応答なしにはなりません。

    • 編集済み 9demaio 2021年12月22日 9:15 修正
    2021年12月22日 9:08
  • どういう意図かわかりませんが、当初の質問はあくまで 2013 年当時の一過性のネタに過ぎません。

    よって、今あなたの手元で起きている現象と似ているかもしれませんが、原因や議論はまったく別の話なので、つなげるのはちょっと違うかな?と思います。
    もっとも、環境原因なので、これだけの情報を提示されても、他の人が再現できるわけでもなく、あなたにとって有益な情報提供があるわけでもありません。

    OS ごとフリーズしない…ということであれば、ダンプファイル解析なり、努力する余地はあると思いますよ。

    2021年12月22日 13:07
    モデレータ