問題タブ [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 - setjmpが伝統的にレジスタを保存するのはなぜですか?
例としてi386を考えてみてください。ただし、他のアーチにも同様の質問が当てはまります。jmp_bufによって保存される従来のi386は、 6つのsetjmp保存されたレジスタ、、、、、、、、およびで構成されます。これらのうち、最初の4つはABIごとに呼び出し元で保存されるため、呼び出された関数自体が、保存された独自の値で上書きします(からの最初の戻りと2番目の戻りの間で変更される場合があります)。したがって、これらのレジスタを?に保存することのポイントは何ですか?スタックと命令ポインタだけを保存するのも同様に機能しませんか?ebxesiediebpespeipsetjmpsetjmpjmp_buf
編集:私は誤って発信者保存と着信者保存を混同していました。これが混乱の原因でした。皆さんの時間を無駄にしてしまったことをお詫びします。
lua - lua_pushstring の実行方法とメモリ不足の setjmp 例外の回避方法
障害が発生した場合にクリーンアップする必要があるリソースを割り当てた後、 lua_pushstring を使用したい場合があります。ただし、ドキュメントが暗示しているように見えるように、 lua_push* 関数は常にメモリ不足の例外で終了する可能性があります。しかし、その例外は私の C スコープを即座に終了し、エラーの場合に解放する必要があるかもしれない一時的に割り当てた可能性のあるものをクリーンアップすることを許可しません。
状況を説明するコード例:
そのような例外が発生するかどうかを事前に確認し、自分のリソースを安全にクリーンアップしたらすぐにプッシュして自分のエラーをトリガーするのを避ける方法はありますか? または、どうにかして setjmp を非アクティブ化し、プッシュを行った後に「魔法の変数」をチェックして、実際に機能したか、エラーが発生したかを確認できますか?
自分の関数をpcallすることも考えましたが、pcallで安全に呼び出したい関数をスタックにプッシュしただけでも、メモリ不足になる可能性がありますね。
明確にするために、Lua が過剰なメモリを割り当てるのを防ぐカスタム メモリ アロケータと組み合わせて使用することを具体的にお願いしているので、システム全体でメモリが不足している場合ではないと仮定します。
c - 非ローカルジャンプでパフォーマンスの問題はありますか?
非ローカルジャンプ(setjmp、longjmp)を使用しています。公演で問題になるのではないかと思います。すべてのスタックを保存しますかsetjmp、それとも一部のポインターだけを保存しますか?
ありがとう。
c - setjmp/longjmpの失敗
ここにコードがあります
結果は次のとおりです。
スイッチ
セグメンテーション違反 後の
エラー1
longjmpが前のスタックにジャンプして戻る理由を知っています。しかし、詳細についてはよくわかりません。「マーク」にはどのような値が格納されているのでしょうか。誰か説明できますか?
x86-64 - AMD64 で setjmp(3) がすべてのレジスタを保存しないのはなぜですか?
setjmpさまざまな実装のソースを閲覧してlongjmpいて、すべての CPU レジスタが構造体に保存されているわけではないことに気付きましたjmp_buf。AMD64 ABI を確認した後、callee-saved レジスターのみが保存されていることに気付きました。
一部のレジスタのみが保存されている場合に、関数の状態を完全に再開する方法がわかりません。確かに、保存されていないレジスタは、後で呼び出すまで何度も何度も上書きされたに違いありませんlongjmpか?
しかし、すべてが完璧に機能するので、私には理解できないことがあります。誰かがこれに光を当てることができることを望んでいました。
ありがとう!
c++ - 複数のファイルで jmp_buf を使用する
明確に、私のサンプルをご覧ください
main.cpp と myfunction.h の 2 つのファイルがあります。
これはmain.cppです
これは myfunction.h です
ここで、スクリーン印刷で「1」を印刷してから「2」を印刷したいのですが、このコードは正しくありません。私を助けてください!どうもありがとう!
c - 開始タグと終了タグを持つCマクロ?
setjmp(jmp_buf)とlongjmp(jmp_buf、int)を使用したcでの例外処理に関するこの記事を読み始めました。したがって、基本的に、タイプxRecordのローカル変数を使用してリストにリンクするリンクリストを作成します。(例2)問題なく動作します。ただし、例3では、ステップがマクロ(XTRYおよびXEND)に要約されます。私を最も苛立たせているのは、例2の実際のswitchステートメントが3で「消えた」ということです。
例2:
例3:
私の質問は、これらの「開閉」マクロをどのように構築できるかということです。
c - setjmp un longjmpでの私の終了(ステータス)
問題は-setjmpとlongjmpを使用して独自のexit(status)を実装する必要があることです。多分誰かがいくつかのポインタを与えることができますか?
c++ - longjmpを使用したC++およびCライブラリ
私はCAPIを備えたLuaを使用しており、そのエラー発生関数はlongjmpsを使用しています。エラーを発生させるとき、私は最初に何がうまくいかなかったかを説明するメッセージを作成し、次にLuaにエラーを発生させるように指示します。例えば
longjmpはスタックを巻き戻さないので、stringstreamオブジェクトが破壊されないことを理解しています。私の記憶が正しければstringstream、他のC ++ライブラリクラスは通常、ヒープにデータを割り当てます。このデータは、オブジェクトが破棄されると解放されます。ただし、ここではデストラクタが呼び出されないため、メモリリークが発生すると思います。スクリプトを書いた人によっては、多くのエラーが発生し、多くのメモリがリークする可能性があります。
他の人もこれと同じような問題を解決する必要があると思いますが、私が求めているものは何も見つかりません。多くの場所でオブジェクトは破壊されないと言われていますが、メモリが解放されるようにする方法が必要だと思いますか?
c - C での setjmp と longjmp の実用的な使用法
setjmp()組み込みプログラミングでlongjmp()関数を実際に使用できる場所を正確に説明できる人はいますか? これらはエラー処理用であることを知っています。しかし、いくつかのユースケースを知りたいです。