エラーをどのように診断する必要がありますかSEHException-外部コンポーネントが例外をスローしました


86

ユーザーが次のようなエラーを報告するたびに

System.Runtime.InteropServices.SEHException-外部コンポーネントが例外をスローしましたか?

プログラマーとして私が原因を特定するためにできることはありますか?

シナリオ:1人のユーザー(私の会社が作成したプログラムを使用)がこのエラーを報告しました。これは1回限りのエラーである場合とそうでない場合があります。彼らは先月、コンピューターが2回「動作を停止」したと述べた。私は経験から、この説明を文字通りに解釈しないことを学びました。これは通常、コンピューターに関連する誰かが期待どおりに機能していないことを意味します。彼らは私にそれ以上の詳細を与えることができず、私は記録されたエラーを見つけることができませんでした。したがって、このエラーである場合とそうでない場合があります。

スタックトレースから、実際のエラーは、相互運用コードを直接呼び出さないクラスを構築するときでしたが、オブジェクトがDevExpressグリッドにデータバインドされたリストの一部である可能性があるという事実によっておそらく複雑になりました。

エラーは、通常はプログラムを終了する未処理の例外ルーチンによって「キャッチ」されましたが、無視して続行するオプションがあります。エラーを無視することを選択した場合、プログラムは引き続き機能しますが、このルーチンが次に実行されたときにエラーが再発しました。ただし、アプリケーションを閉じて再起動した後、再び発生することはありませんでした。

問題のコンピュータはストレスがたまっていないようでした。Vista Businessを実行しており、2 GBのメモリがあり、タスクマネージャーによると、アプリケーションではその約半分しか使用していませんでした。

関連する場合と関連しない場合がある情報がもう1つあります。同じプログラムの別のセクションでは、ネイティブdllのドットネットラッパーであるサードパーティコンポーネントを使用していますが、このコンポーネントには既知の問題があり、非常にまれに

保護されたメモリの読み取りまたは書き込みを試みました。これは多くの場合、他のメモリが破損していることを示しています

コンポーネントメーカーによると、これは社内で使用しているコンポーネントの最新バージョンで修正されているとのことですが、まだお客様に提供されていません。

エラーの影響が少ないこと(作業が失われることはなく、プログラムを再起動して元の場所に戻るのに最大で1分しかかからない)、および顧客がまもなく新しいバージョンを取得することを考えると(3番目に更新された-パーティーコンポーネント)、私は明らかに私の指を交差させることができ、エラーが二度と起こらないことを願っています。

しかし、私にできることは他にありますか?

回答:


28

はい。このエラーは、.NETエラーにマップされなかった構造化例外です。おそらく、キャッチされなかったネイティブ例外をスローするのはDataGridマッピングです。

ExternalException.ErrorCodeプロパティを確認することで、発生している例外を確認できます。スタックトレースを確認し、DevExpressグリッドに関連付けられている場合は、問題を報告します。


1
StackTraceはDevExpressについてはどこにも言及していませんが、私のクラスについてのみ言及しています。ErrorCodeが何であったかを確認する必要があります。
sgmoore 2009

その場合は、何がエラーメッセージを正確にスローしたかを把握してください。
リードコプシー

4
「ExternalException.ErrorCodeプロパティを見て」-それを正確に行う方法についてのヒントはありますか?VSは、「タイプ 'System.Runtime.InteropServices.SEHException'の未処理の例外が.... dllで発生しました。追加情報:Eine externe Komponente hateineAusnahmeausgelöst。」と表示しますが、C#アプリケーションなど以外にはリンクがありません。例外オブジェクトの「詳細」をどこでも見ることができます。
またはマッパー2018

8

プログラムが最初にネイティブdllラッパーを使用したときにスローされたSEHExceptionで同様の問題が発生しました。そのラッパーのネイティブDLLが欠落していることが判明しました。例外は、これを解決するのにまったく役に立ちませんでした。最終的に助けになったのは、バックグラウンドでprocmonを実行し、必要なすべてのDLLをロードするときにエラーがあったかどうかを確認することでした。


5

この投稿で説明されているように問題が発生した場合:

SEHExceptionをスローするasp.netmvcデバッガー

その場合の解決策は次のとおりです。

Trusteerのアプリケーション(信頼関係など)がある場合は、システムをアンインストールして再起動するだけで問題なく動作します...この解決策は次のとおりです。

http://forums.asp.net/t/1704958.aspx/8/10?Re+SEHException+thrown+when+I+run+the+application


3

コンポーネントメーカーによると、これは社内で使用しているコンポーネントの最新バージョンで修正されたとのことですが、これはまだお客様に提供されています。

顧客が直面している問題が、最新バージョンを顧客に展開する前に、または展開する前に、最新バージョンで修正したと彼らが言う問題であるかどうかをテストする方法をコンポーネントメーカーに依頼してください。


1

アプリがネットワーク共有上にあり、アプリの使用中にデバイス(ラップトップ、タブレットなど)がネットワークから切断されると、このエラーが発生しました。私の場合、Surfaceタブレットがワイヤレス範囲外になったことが原因でした。より良いWAPをインストールした後は問題ありません。


1
コードライブラリとサードパーティライブラリの両方で、また1つの顧客環境で、リモートロケーションのライブラリと同様に、さまざまな種類のリフレクション(GetAssemblyName、GetProperty、Activatorなど)にアクセスしているときに、ランダムに取得していました。.netフレームワークのバグであるという証拠がたくさんあります。
Andriy K

Andriy K:これは.NETの問題ではないと思います。ネットワーク共有で開いているファイルのハンドルが何らかの理由で失われたり、削除されたりしたと思います。Windowsのバグかネットワークの問題かもしれません。アセンブリはメモリマップされており、オンデマンドでディスクからページインされます(時限爆弾)。メモリが少ない状況でもメモリを破棄できる可能性があります。開いたファイルハンドルが安定していない場合、これはおそらく煙で爆発します。.NETはそれを処理してファイルを再度開いた可能性がありますが(問題をスムーズに)、複雑になる可能性があります。
osexpert 2018年

私も同じ問題を抱えてる。スタックトレースなしでSystem.Runtime.InteropServices.SEHException(0x80004005)を取得します。これは、TargetInvocationExceptionのInnerExceptionです。TargetInvocationExceptionにはスタックトレースがありますが、mainまたはApplication.Runからのものであるように見えたため、私には意味がありませんでした。それは非常にランダムに発生し、主に夕方\夜に発生します。唯一の「解決策」は、ネットワークドライブから実行しないことだと思います。-| たぶん私は、このシナリオをブロックすることができ、チェックを追加します。stackoverflow.com/questions/8633680/...
osexpert

0

ちょうど別の情報...アプリケーションがUNC /ネットワークパスから開始されたWindows2012 R2 x64TSシステムで今日その問題が発生しました。この問題は、すべてのターミナルサーバーユーザーの1つのアプリケーションで発生しました。アプリケーションのローカルでの実行は問題なく機能しました。再起動後、再び機能し始めました-スローされたSEHExceptionはコンストラクタinitとTargetInvocationExceptionでした


0

私のマシン構成:

オペレーティングシステム:Windows 10バージョン1703(x64)

Visual Studio 2017 CommunityエディションでC#.Netプロジェクトをデバッグしているときに、このエラーが発生しました。実行時にロードされたC ++アセンブリでp / invokeを実行してネイティブメソッドを呼び出していました。OPによって報告されたのとまったく同じエラーが発生しました。

Visual Studioは、マシンの管理者ではないユーザーアカウントで起動されていることに気付きました。次に、マシンの管理者である別のユーザーアカウントでVisualStudioを再起動しました。それで全部です。私の問題は解決され、私は再び問題に直面しませんでした。

注意すべきことの1つは、C ++アセンブリで呼び出されていたメソッドは、レジストリにいくつかのことを書き込むことになっていたことです。RCAを実行するためにC ++コードをデバッグしませんでしたが、Windows 10オペレーティングシステムでレジストリを書き込むには管理者権限が必要なため、すべてが失敗した可能性があります。そのため、以前は、マシンの管理者権限を持たないユーザーアカウントでVisual Studioを実行していたときに、ネイティブ呼び出しが失敗していました。


0

セットアップしていたインメモリキャッシュで単体テストを実行しているときに、このエラーが発生しました。キャッシュが氾濫しました。キャッシュを無効にしてVMを再起動した後、正常に機能しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.