問題タブ [seh]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - コールバックで win32 seh 例外を RaiseException(...) しても安全ですか? (x86 と x64 の両方で)
特定の状況でRaiseException()
、Win32 関数に渡されたコールバック内で例外を発生させるために呼び出す必要があります。
一例として、 を呼び出して、コール スタックのずっと下のブロックで処理RaiseException()
したいと思います。LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM)
__try { } __except() { }
x86とamd64で予測可能な結果が得られるという意味で、これは「安全」ですか? リソースを漏らさないという意味で「安全」ですか†?
†:私が制御する中間スタック フレームは、リソースをリークしないように設定されていると仮定します。私は、私にとって「不透明」な Win32 API スタック フレームだけに関心があります。
c# - .NET でのネイティブの win32 例外データ/引数の読み取り
マネージド (.net/c#) の catch ブロックでネイティブ (c++/win32) でスローした例外に関するデータを受信しようとしています。
たとえば、C++ では次のことができます。
この関数は、C# から P/Invoke を介して呼び出すことができます。
SEHExceptionには、インポートされた DLL 関数からの文字列が含まれていません。
SEHException.ErrorCode は常に E_FAIL のように見えますが、いずれにしても int よりも豊富なデータをマーシャリングしたいと考えています。
何か不足していますか、または例外を介してこの文字列データを取得する別の方法はありますか?
目的は、SetUnhandledExceptionFilter のようなネイティブ フィルターを設定することにより、ネイティブ スタック トレースでネイティブ例外を再発生させることです。参考までに。
windows - 構造化された例外ハンドラーは、ほぼ同じマシンでゼロに近い EIP トラップを異なる方法でキャッチしますか?
私はかなり複雑ですが、さまざまな x86-32 および x86-64 ボックスで実行されている非常によくテストされたアセンブリ言語 x86-32 アプリケーションを持っています。これは言語コンパイラのランタイム システムであるため、別のコンパイル済みバイナリ プログラムである「オブジェクト コード」の実行をサポートします。
Windows SEH を使用して、さまざまな種類のトラップ (ゼロ除算、不正アクセスなど) をキャッチし、Windows によって提供されるコンテキスト情報を使用して、トラップ時のマシンの状態を示すレジスタ ダンプを出力します。(関数のバックトレースを出力したり、必要に応じてゼロ除算から回復したりするなど、質問に関係のない他の多くのことを行います)。これにより、「オブジェクト コード」の作成者は、自分のプログラムで何が問題になったのかを把握できます。
2 つの Windows 7-64 システムでは動作が異なりますが、これは多かれ少なかれ同一ですが、不正なメモリ アクセスであると思われます。具体的な問題は、「オブジェクト コード」(十分にテストされたランタイム システムではない) が愚かにも 0x82 を EIP にロードすることです。これは、アドレス空間のAFAIKに存在しないページです。SEH を介した Windows トラップが予想され、EIP=00000082 などのレジスタ ダンプが予想されます。
あるシステムでは、まさにそのレジスタ ダンプが得られます。ここで表示できますが、私の質問には何も追加されません。したがって、ランタイム システムの SEH がこれをキャッチして状況を表示できることは明らかです。このマシンには、MS 開発ツールが搭載されていません。
ランタイム システムとオブジェクト コードのまったく同じバイナリを使用するもう 1 つの (「謎」) システムでは、コマンド プロンプトしか表示されません。それ以上の出力はありません。FWIW、このマシンには MS Visual Studio 2010 が搭載されています。ミステリーマシンは他の目的で頻繁に使用されており、通常の使用では他のおかしな動作は見られません.
動作の違いは、どこかの Windows 構成、または Visual Studio が制御する何かによって引き起こされると思います。システム メニューの DEP 構成ではありません。どちらも「標準システムプロセスのDEP」として構成されています(バニラ)。また、ランタイム システムの実行可能ファイルには「いいえ (/NXCOMPAT:NO)」が構成されています。
どちらのマシンも i7 ですが、チップ、4 コア、大量のメモリ、マザーボードが異なります。これは関係ないと思います。確かに、これらの CPU は両方とも同じ方法でトラップを取得します。
ランタイム システムには、起動時に次の行が含まれます。
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); // クラッシュ時の Windows ポップアップを停止します
これは最近、クラッシュが発生したときに「謎の」システムがポップアップ ウィンドウ「xxx.exe が動作を停止しました」を表示しないようにするために追加されました。ポップアップ ボックスの動作は最初のシステムでは発生しないため、「ミステリー」マシンの別のコーナーに問題を押し込むだけでした。
これを構成/制御する手がかりはありますか?
私が使用しているSEHコードをここに提供します。このコードで見られる明らかな状態に影響を与えないと私が主張する、かなりの量の健全性チェック コードを削除するように編集されています。
ランタイム システムのトップ レベルは、(CreateThread を使用して) 一連のワーカー スレッドを生成し、ASMGrabGranuleAndGo を実行するようにポイントします。各スレッドは独自の SEH を設定し、ワークスティーリング スケジューラである RunReadyGranule に分岐します。私の知る限りでは、その後 SEH は変更されていません。少なくとも、ランタイム システムと「オブジェクト コード」はこれを行いませんが、基礎となる (標準の「C」などの) ライブラリが何を行うかはわかりません。
さらに下に、トラップ ハンドラー TopLevelEHFilter を提供します。はい、レジスター印刷機自体が爆発し、2 番目の例外が発生する可能性があります。すぐにもう一度確認してみますが、IIRC で謎のマシンのデバッガーでこれをキャッチしようとした最後の試みでは、デバッガーに制御が渡されず、ポップアップ ウィンドウが表示されました。
c++ - EXCEPTION_CONTINUE_EXECUTION 奇妙な動作
コードを書きました
そして私は出力を待っています
しかし、私は
そして無限ループ。
それはなぜです?
volatile
s と j にキーネームを追加しても修正されませんでした。