none
PerformanceCounterCategory.GetCategories()を実行するとIOExceptionが発生する RRS feed

  • 質問

  • namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                System.Diagnostics.PerformanceCounterCategory.GetCategories();
            }
        }
    }

    以上のプログラムを実行すると

    例外がスローされました: 'System.IO.IOException' (mscorlib.dll の中)
    追加情報:指定されたレジストリ キーは存在しません。

    というエラーログが発生します。

      mscorlib.dll!Microsoft.Win32.RegistryKey.Win32Error(int errorCode, string str) 不明
      mscorlib.dll!Microsoft.Win32.RegistryKey.InternalGetValue(string name, object defaultValue, bool doNotExpand, bool checkSecurity) 不明
      mscorlib.dll!Microsoft.Win32.RegistryKey.GetValue(string name) 不明
      System.dll!System.Diagnostics.PerformanceCounterLib.GetStringTable(bool isHelp) 不明
      System.dll!System.Diagnostics.PerformanceCounterLib.NameTable.get() 不明
      System.dll!System.Diagnostics.PerformanceCounterLib.CategoryTable.get() 不明
      System.dll!System.Diagnostics.PerformanceCounterLib.GetCategories() 不明
      System.dll!System.Diagnostics.PerformanceCounterLib.GetCategories(string machineName) 不明
      System.dll!System.Diagnostics.PerformanceCounterCategory.GetCategories(string machineName) 不明
    ConsoleApplication1.exe!ConsoleApplication1.Program.Main(string[] args) 行 7 C#

    スタックトレースが以上で
    https://msdn.microsoft.com/ja-jp/library/7a65ekyd(v=vs.110).aspx
    こちらを参照してもIOExceptionが発生するという記述もなく解消方法の検討がついておりません。

    OS:Windows10 Pro
    実行環境はVisualStudio2015のデバッグ実行
    フレームワークは.NetFramework4.6.1 です。

    レジストリを直接操作した覚えはないのですが何かの拍子に変えてしまったのかもしれません。
    発生しないように修正する方法をどなたか、ご教示してくれたら幸いです

    2017年12月26日 10:12

回答

  • 該当のレジストリがなければ、内部的に発生&キャッチされることは避けられないでしょう。

    レジストリがないのはなぜなのかという話は若干、開発よりの話から遠ざかる気もしなくはないですが、そのあたりは情報を持っていません。別の方のコメントをお待ちいただくか、有償サポートで Microsoft に聞くかですね。

    -----

    > 少なくとも私の環境ではもともとは発生していなかったので
    > 原因を解消をする方法はないのでしょうか?という質問です。

    その「もともとは発生しなかった」がデバッガーの設定の差であれば、前回のコメント通り、例外スロー時にキャッチされていようが中断する設定したことが要因です。
    質問文にあったスタックトレースをコピーできるような場面で一時停止するのはデバッガーをそのように設定している時だけです。
    デバッガーの設定は同じ(内部でキャッチされる例外でも一時停止する状態にしていた)ことが確実で、以前は発生しなかったのであれば前述の通り、レジストリの差なので、開発の話から遠ざかります。

    個人的には「以前発生しなかった」と「今発生する」の差は、デバッガーの設定を意識せずに変えたことがきっかけではないか?と思いますけれども。

    なお、私の環境でもスクリーンショットに載せたように、内部的に IOException が発生しています。
    意図的にデバッガーの設定を変えてこの場面で一時停止できるようにしましたが、デフォルトのデバッガーの設定では素通りする場所です。

    2017年12月28日 3:42
    モデレータ

すべての返信

  • 例外がスローされる時に止めるように設定していませんか?

    .NET Framework の実装 を見る限り、IOException を発生させつつ、キャッチしながら処理を終える実装となっています。
    通常、外に IOException が飛び出ることはないため、あなたの Visual Studio の設定で、内部で発生した例外でもデバッグを一時停止するように設定しているように思えます。

    デバッグ - ウィンドウ - 例外の設定で表示される例外設定ペインでリセットの操作をするか、表示されている「IOException が発生しました。」のところで、「この種類の例外がスローされると中断します」のチェックを外すかでしょうね。

    2017年12月26日 14:03
    モデレータ
  • Azulean 様

    回答ありがとうございます。

    ですが、こちらの質問が分かりづらく申し訳ありません

    IOExceptionで止まらないようにしたいのではなく
    IOExceptionを発生しないようにしたいのです。

    上記プログラムで全ての環境でIOExceptionが発生するものなら無視するのですが
    少なくとも私の環境ではもともとは発生していなかったので
    原因を解消をする方法はないのでしょうか?という質問です。

    2017年12月28日 1:08
  • Azuleanさんのコメントを理解できないのでしょうか? IOExceptionは発生しないと言っています。

    もしかして質問内容が間違っていて、(IOExceptionに限らず)何等かの例外が発生する環境と発生しない環境があり、その原因を知りたいということでしょうか?

    であればドキュメントの備考にも書かれているように必要な権限を持っていないことが原因と思われます。

    2017年12月28日 1:21
  • 該当のレジストリがなければ、内部的に発生&キャッチされることは避けられないでしょう。

    レジストリがないのはなぜなのかという話は若干、開発よりの話から遠ざかる気もしなくはないですが、そのあたりは情報を持っていません。別の方のコメントをお待ちいただくか、有償サポートで Microsoft に聞くかですね。

    -----

    > 少なくとも私の環境ではもともとは発生していなかったので
    > 原因を解消をする方法はないのでしょうか?という質問です。

    その「もともとは発生しなかった」がデバッガーの設定の差であれば、前回のコメント通り、例外スロー時にキャッチされていようが中断する設定したことが要因です。
    質問文にあったスタックトレースをコピーできるような場面で一時停止するのはデバッガーをそのように設定している時だけです。
    デバッガーの設定は同じ(内部でキャッチされる例外でも一時停止する状態にしていた)ことが確実で、以前は発生しなかったのであれば前述の通り、レジストリの差なので、開発の話から遠ざかります。

    個人的には「以前発生しなかった」と「今発生する」の差は、デバッガーの設定を意識せずに変えたことがきっかけではないか?と思いますけれども。

    なお、私の環境でもスクリーンショットに載せたように、内部的に IOException が発生しています。
    意図的にデバッガーの設定を変えてこの場面で一時停止できるようにしましたが、デフォルトのデバッガーの設定では素通りする場所です。

    2017年12月28日 3:42
    モデレータ
  • > 上記プログラムで全ての環境でIOExceptionが発生するものなら無視するのですが
    > 少なくとも私の環境ではもともとは発生していなかったので
    > 原因を解消をする方法はないのでしょうか?という質問です。

    ということは、自身のプログラム以外の可能性。。。というのも考えられのかも。
    例えば、何かのソフトウェアをインストールしたことにより、そのソフトウェアが該当レジストリ アクセスに介在し、自身のプログラムでの動作に影響を与えるようになった。。。という可能性も考えられると思います。
    私が勝手に思うだけで根拠はありませんが、もしそーだとすると、誰がレジストリ アクセスにちょっかいを出しているのか、きちんと調べる必要があると思います。
    レジストリ アクセスにちょっかいを出す方法は色々とあるので、それを調べるにはそれなりに「根性」が必要になります。
    (そもそも私の推測が外れている可能性もあるので、その場合は根性を出しても徒労に終わる可能性もあるし。。。)

    あとは。。。
    問題の IOException が、不特定のレジストリ アクセスで発生するのか、それとも特定のレジストリ アクセスだけなのか、きちんと切り分けた方が良いと思います。
    2017年12月29日 1:28
  • Azulean様
    >その「もともとは発生しなかった」がデバッガーの設定の差であれば、前回のコメント通り、例外スロー時にキャッチされていようが中断する設定したことが要因です。
    >質問文にあったスタックトレースをコピーできるような場面で一時停止するのはデバッガーをそのように設定している時だけです。

    すみません。最初の情報が足りませんでした。
    質問のスタックトレースは質問をするために、意図的に停止するようにして出力していました。

    >デバッガーの設定は同じ(内部でキャッチされる例外でも一時停止する状態にしていた)ことが確実で、以前は発生しなかったのであれば前述の通り、レジストリの差なので、開発の話から遠ざかります。
    そうなんですね。それではこの質問は終了させていただきます。

    >なお、私の環境でもスクリーンショットに載せたように、内部的に IOException が発生しています
    よく考えればそうでなければスクリーンショット張れないですね。失礼な返信をしてしまい申し訳ありませんでした。

    >佐祐理 様
    >であればドキュメントの備考にも書かれているように必要な権限を持っていないことが原因と思われます。

    >お馬鹿 様
    >問題の IOException が、不特定のレジストリ アクセスで発生するのか、それとも特定のレジストリ アクセスだけなのか、きちんと切り分けた方が良いと思います。

    情報ありがとうございます。
    それらの方からも詳しく原因をしらべてみます。


    • 編集済み starapt 2018年1月4日 2:59
    2018年1月4日 2:58