問題タブ [setjmp]
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++ - このコードには隠れたバグが含まれていますか?
次のコード:
- gcc バージョン 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5/32bits) でコンパイルすると問題なく動作します。
- MSVC10 (Win7/32 ビット) でコンパイルすると正常に動作します。
- gcc バージョン 4.5.2 (Win7/32 ビットの MinGW) で実行するとクラッシュする
main.cpp :
デバッグしてみましたが、プログラムの動作がおかしくなりました。場合によっては、最初のブレークポイント (BP1) を通過して BP2 でクラッシュし、プログラムが無限ループに陥った場合のように、制御が BP1 に到達しないこともあります。私のデバッグスキルではこれ以上は言えません。
このコードは、MinGW 4.5 で奇妙な動作を示す最小限のものです。また、次のことに気付きました。
do_work関数呼び出しをその内容で置き換えると、プログラムは正常に実行されます。try{ ... } catch(...){ }内のブロックを削除するdo_workと、プログラムは正常に実行されます。- 最適化フラグは効果がありません (常にクラッシュします)。
C++ コードの問題は認識してsetjmp/longjmpいますが、一部のレガシー C コードとのインターフェイスに使用せざるを得ません。
私の質問 :
- これは欠陥/バグ/エラーコードですか? または、MinGW 4.5 がコードを誤って処理していますか? (ツールのせいにするのは辛辣でおこがましいですが、いくつかの設定に問題があるのではないかと思います)。
アドバイスをありがとう。
必要に応じてタグを付け直してください。
c - setjmp/longjmpについて
setjmp/longjmpを調査していたところ、 setjmpが命令ポインター、スタック ポインターなどのレジスターを保存することがわかりました...
ただし、ここで得られないのは、スレッド自体のスタック内のデータをsetjmpとlongjmpの呼び出しの間で変更できないということです。その場合、longjmpは期待どおりに動作しません。
明確にするために、たとえば、longjmpがスタック ポインターを復元するとき、スタック ポインターが現在指しているメモリ内のデータは、setjmpが呼び出されたときと同じではないとします。これは起こりえますか?そうなったら困りませんか?
また、「 setjmp() ルーチンを呼び出したルーチンが戻った後、longjmp() ルーチンを呼び出すことはできません。」というステートメントが意味することは何ですか。
c - setjmp/longjmpでフォークを使用する
setjmp / longjmpと組み合わせたフォークを使用して、マルチスレッドフォークに基づくチェックポイントスキームを実装しようとしていました。私は自分のソリューションが機能することを望んでいましたが、予想どおりには機能しませんでした。チェックポイント/ロールバックの使用例とともに、コードを以下に示します。
主なアイデアは、関数pthread_create_with_stackを使用して行われるように、自分でスレッドにスタックを割り当ててから、メインスレッドからのフォークを使用することです。フォークされたプロセス(チェックポイント)は最初に中断され、ウェイクアップ(ロールバック)されると、フォークされたプロセスのメインスレッドはpthread_createを呼び出してスレッドを再作成し、元のプロセスのスレッドと同じスタックを使用します。また、 longjmpは、プロセスがチェックポイントとしてフォークされたときにコード内の同じポイントにジャンプするように、最初にスレッドルーチンで実行されます。すべてのsetjmp呼び出しは、関数my_pthread_barrier_wait内で行われるため、ロックを取得したスレッドはありません。
ここでの問題はsetjmp/lonjmpだと思います。getcontext / savecontext / makecontextはここ、または他の何かに役立ちますか?setjmp / longjmpでさえ、ここで機能するような方法で使用できますか?どんな解決策も大歓迎です。
c - setjmp/longjmp で volatile が機能する理由
setjmp() の呼び出し以降に値が変更された可能性がある場合、longjmp() の呼び出し後、非 volatile 修飾ローカル オブジェクトにアクセスしないでください。この場合の値は不確定と見なされ、それらへのアクセスは未定義の動作です。
今私の質問は、なぜ揮発性がこの状況で機能するのですか? その volatile 変数を変更しても longjmp は失敗しませんか? たとえば、次の例で longjmp はどのくらい正しく機能しますか? コードが longjmp の後で setjmp に戻った場合、local_var の値は 1 ではなく 2 になりませんか?
c - setjmp/longjmpにvolatileを使用した場合のパフォーマンスオーバーヘッド
setjmp / longjmpを機能させるには、ローカル変数を揮発性として宣言する必要があります。誰かがそのコードを-O3でコンパイルしている場合、パフォーマンスに対する揮発性変数の影響はどのくらいになりますか。x86マルチコアプラットフォームでは、それは巨大なのか、それともほんの少しなのか?
私の意見では、その揮発性変数はまだキャッシュ可能であり、キャッシュからの読み取り/書き込みはとにかく非常に高速であるため、わずかなオーバーヘッドしか追加されません。意見?
c - longjmp の Eclipse で GDB がクラッシュする
プログラムを書くためにEclipseでcを使用しています。GDB を使用して段階的にデバッグする必要があります。ただし、longjmp コマンド (スタックのコンテキストを保存しようとすると) で GDB が eclipse 内でクラッシュします (そこにブレークポイントがあるためですか?) これを回避する方法はありますか? 私は過去 6 時間にわたってインターネットを探し回っていますが、解決策を見つけることができないようです。クラッシュしているコード行は次のとおりです
助けてくれる人にはとても感謝しています。
ありがとう!
編集:さらに検索した後、このWebページを見つけましたが、使用方法についての手がかりがありません.
http://www.delorie.com/gnu/docs/gdb/gdb_271.html
助けていただければ幸いです!
c - 自動変数とレジスタ変数-同じように最適化されていますか?
私はAPUEを読んでいて、に来たときlongjmp、質問が来ました。最適化の前は、自動変数とレジスタ変数の両方がメモリに格納され、最適化後は、レジスタに格納されると本は述べています。しかし、を使用するobjdump -S a.outと、両方が即時オペランドになっていることがわかりました。それで ?
exception - OCaml 内部: 例外
OCaml ランタイムで例外がどのように処理され、非常に軽量になるのか知りたいです。setjmp/longjmp を使用しますか、それとも各関数で特別な値を返し、それを伝播しますか?
longjmp はシステムに少し負担をかけるように思えますが、例外が発生した場合にのみ、各関数の戻り値をチェックしながら、関数を呼び出した後にすべての値をチェックする必要があります。多くのチェックとジャンプがあり、パフォーマンスが最悪のようです。
OCaml が C とどのようにインターフェースするか ( http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc142 ) を調べ、callback.h を見ると、例外は次を使用してタグ付けされているようです。オブジェクトのメモリ アラインメント ( #define Is_exception_result(v) (((v) & 3) == 2) )。これは、その実装が longjmp を使用せず、各関数呼び出しの後に各関数の結果をチェックしていることを示しているようです。あれですか?または、C 関数は既に例外をキャッチしようとしていて、それをこの形式に変換しますか?
ありがとうございました!
c - MinGW ではクラッシュしなかったのに、MSVC で setjmp/longjmp がクラッシュするのはなぜですか?
setjmp()/longjmp()を使用してコルーチン システムを実装したい 。次に、小さな .c ファイルをコーディングしてテストすることにしました。MinGW では問題ありません。欲しい結果が得られました。しかし、MSVC ++でコンパイルすると、プログラムがクラッシュします:「アクセス違反」
perl - Sys :: SigAction :: timeout_callの使用は安全ではありませんか?
Leon Timmermansの記事を読んだばかりですが、シグナルベースのタイムアウトについて知っておくべきことと、それがの使用にどのように適用されるのか疑問に思っていましたSys::SigAction::timeout_call()。
1)まず第一に、安全でない信号 をtimeout_call()使用しているように思われるため、 CERTセキュアコーディングルールSIG32-Cが適用されます。longjmp
2)timeout_callタイムアウトを監視しているコードに純粋なperlコードのみが含まれている場合(つまり、XSモジュールへの呼び出しがない場合)は安全に使用できますか?