問題タブ [structured-exception]
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.
exception-handling - .seh_stackalloc とスタック配置
GNU アセンブラ用の x64 アセンブリを書いています。.seh_ * ディレクティブについて調べてみましたが、それらに関する情報があまり見つかりません。ドキュメントはそれらgas
についてまったく言及していません。
しかし、私が理解しているように、SEH アンワインド操作中にコードがスタックにある可能性がある場合は、これらを使用することが期待されています。また、私のコードは操作をスタックし、他の関数を呼び出すため、SEH の可能性があるため、これらを使用する必要があります。
ほとんどの場合、私はそれが正しいと思います:
しかし、はっきりしない点が 1 つあります。私はこの指示を持っています:
スタックアライメントを実行していることをSEHに伝えるにはどうすればよいですか?これにより、スタックが 15 バイト (ほとんどありません) から 8 バイト (非常に可能性が高い)、0 バイト (確かに可能) に調整される可能性があります。実際の金額は実行時まで決定されない可能性があるため、行き詰まっています。
.seh 命令をスキップできると思いますが、そこで 8 バイトのスタックが予約された場合、アンワインドを破棄した可能性がありますね。それはここでの目的全体を無効にしませんか?
または、アライメントを省略できます。しかし、他の関数 (memcpy など) を呼び出した場合、スタックを整列する必要はありませんか? MSによると:
スタックは、プロローグ内を除いて、常に 16 バイトでアラインされた状態に維持されます。
たぶん、これで自分のやり方を「推論」できますか?私を呼んだ人が正しいことをした場合 (もし...)、彼がしたときにスタックが整列していたcall
ので、今では 8 バイト (戻りアドレス) とプロローグで行ったことは何でもずれています。私はこれに頼ることができますか?壊れやすいようです。
私は他のコードを調べてみましたが、私が見ているものを信頼できるかどうかはわかりません. .seh_ gas
* の誤用によるエラーを報告しているとは思えません。おそらく、実際の例外が発生しているときに問題が発生するだけです (常にそうであるとは限りません)。
これをやるなら、ちゃんとやりたい。スタックの配置は一般的なことのように思われるので、誰かがここで解決策を持っている必要があります. 私はそれを見ていません。
winapi - WIN32 と WIN64 での浮動小数点ユニット コンテキストの構成
Windows SEH で無効な浮動小数点演算を報告するために使用する未処理の例外フィルター (SetUnhandledExceptionFilter() を参照) を作成しようとしています。例外をトラップし、スタック トレースを出力してから、浮動小数点例外を無効にし、結果の非有限値または非数値値で実行を再開したいと考えています。
例外をキャッチして実行を再開する機能を示すために、以下の簡単なプログラムを作成しました。#ifdef _WIN64 の使用に注意してください。ContextRecord の定義は対象となるアーキテクチャによって異なります (WIN32 は「FloatSave」を使用し、WIN64 は「FltSave」を使用します)。
WIN32 .exe として実行すると、上記のプログラムは期待どおりに実行され、出力は次のようになります。
ただし、WIN64 .exe として実行すると、プログラムは無限ループに入り、浮動小数点例外を継続的に再キャッチします。
これは、WIN32 と WIN64 の間で ContextRecord の定義が異なることに関連していると思われる浮動小数点ユニットの構成に成功していないことを示しているようですが、正確な方法に関する適切な関連ドキュメントを見つけることができませんでした。浮動小数点コンテキストを設定します。
WIN64 の浮動小数点コンテキストを正しく設定する方法について何か考えはありますか?
前もって感謝します
c++ - エラー C2712 オブジェクトの巻き戻しが必要な関数では __try を使用できません
Windows サービスをインストールして開始する単純な C++ WIN32 API プログラムを作成しています。コードで SEH __try&__finaly を使用しています。残念ながら、次のような既知のエラーが発生します。
error C2712 Cannot use __try in functions that require object unwinding.
SEHコードをメイン関数から別の関数に移動したり、プロジェクトのプロパティでエラーを再生したりするなど、おなじみの方法で解決しようとしました:C++例外を有効にします。しかし、何も機能しませんでした。とにかく、これはソースです: