問題タブ [stack-unwinding]
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.
debugging - gdb ARM Cortex-M 例外の巻き戻し
私がコンパイルしたGCC(v4.7.2)、BinUtils(v2.22)、Newlib(v1.20)、およびGDB(v7.5)を使用して、いくつかのCortex-M4(Freescale K60)デバイスを使用してきました。私は、GDB がハード例外から解放できないことにいつも悩まされてきました。
最近、FreeScale の CodeWarrior を使用する機会がありました。ここで、バイナリをデバッグ用にロードし (ツールでコンパイル)、例外を巻き戻すことができました。CodeWarrior は内部で GDB v7.4.1 を実行しているようです。GDB 用に見逃したパッチ、または設定オプションはありますか?
GDB のビルドに使用されるスクリプトは次のとおりです。 TOOLCHAIN=gdb-7.5 mkdir -p BUILD/gdb cd BUILD/gdb ../../${TOOLCHAIN}/configure --prefix=${PREFIX} --target=${ TARGET} --enable-interwork --enable-multilib --with-expat=yes --with-python --without-auto-load-safe-path 2>&1 | ティーconfigure.out make all install cd ../../
ありがとう!
ios - iOS アプリで終了ボタンを設定する
Swift で開発したシンプルなゲーム アプリがあります。オプション画面に、ユーザーが現在のゲームを終了して開始画面に戻るためのボタンがあります。これを行う方法をいくつか調べましたが、どの方法が正しいかわかりません。
オプション 1: exit 関数を作成し、メインの ViewController でその関数を定義しました。次のようになります。
次に、Options View Controller 内の終了ボタンから終了アイコンへのドラッグを制御しました。これは機能しますが、予期しない結果が得られます。ビュー コントローラーを巻き戻すと、途中でコードがトリガーされます。ルート VC に戻るまでに、いくつかのエラーが発生しています。
オプション 2: 終了ボタンからルート VC へのドラッグを制御します。これは機能し、エラーは発生しませんが、これが良い方法かどうかはわかりません。これにより、他のすべての VC がスタックから削除されますか?それとも、古いゲームの上に新しいゲームを開始するだけですか?
c - スタック フレームを繰り返し処理しても安全ですか?
以前の質問で、親プロセスから子プロセスのスタック トレースをプログラムで取得できるかどうかを確認しようとしていました。
成功しましたが、別の疑問が頭に浮かびました。プログラムの実行中にこれらのフレームを直接調べても安全ですか? ここでは、「子のスタックの値を変更しない」という意味で「安全」と定義しています。
たとえば、NPB-Serial CG Class A ベンチマークを実行して得たスタック トレースの例を次に示します。
各スタック ポインター エントリの値をコピーして、スタックのダンプを取得したいと考えています。たとえば、0x7ffe5e368e10
そのアドレスから現在のスタック ポインターまでのすべての値を別の場所にコピーします。
これを行うリスクはありますか?それとも、これについて間違って考えていますか (これを行う簡単な方法があるように)?
c++ - 「原子性を高める」ために重要な機能をデストラクタに配置しますか?
2 つの C++ 関数 foo1() と foo2() があり、その foo1() が実行を開始する可能性を最小限に抑えたいとしますが、何らかの外部イベントのために foo2() が呼び出されません。どちらも呼び出されなくても構いませんが、foo1() が呼び出された場合は foo2() を実行する必要があります。どちらの関数も連続して呼び出すことができ、例外をスローしません。
関数をオブジェクトにラップし、デストラクタで両方を呼び出すことに利点/欠点はありますか? アプリケーションがマルチスレッド化された場合 (たとえば、親スレッドがクラッシュした場合) は変わりますか? foo1() が呼び出される限り foo2() が呼び出されるようにするための他のオプションはありますか?
それらをデストラクタに入れると、たとえば SIGINT に役立つかもしれないと思いましたが、デストラクタの途中でも SIGINT がすぐに実行を停止することを知りました。
編集:
明確にするために: foo1() と foo2() の両方が抽象化されるため、他の誰かがそれらを間違った順序で呼び出すことは気にしません。私の懸念は、アプリケーションの実行中のクラッシュ、例外、またはその他の中断 (たとえば、誰かが SIGINT を押した、別のスレッドがクラッシュしたなど) にのみ関連しています。
c++ - Linux/GCC で NULL ポインター アクセスを C++ 例外に変換する
Linux で NULL ポインター アクセスを C++ 例外に変換する方法はありますか? Java の NullPointerException に似たもの。クラッシュする代わりに、次のプログラムが正常に返されることを願っています (コンパイル時にコンパイラがこの NULL ポインター アクセスを把握できないと仮定します)。
C ++でのNULLポインターアクセスは未定義の動作であるため、標準的な方法は期待していません。x86_64 Linux / GCCでそれを行う方法を知りたいだけです。
私はこれについて非常に原始的な研究を行いましたが、可能かもしれません:
- Linux で NULL ポインタがアクセスされると、SIGSEGV が生成されます。
- SIGSEGV ハンドラ内では、プログラムのメモリとレジスタ情報が利用可能です (
sigaction()
シグナルハンドラの登録に使用されている場合)。プログラムを逆アセンブルすると、SIGSEGV の原因となった命令も使用できます。 - プログラムのメモリやレジスタを変更し、例外インスタンスを作成/偽造します (おそらく、_Unwind_RaiseException などの低レベルのアンワインド ライブラリ関数を呼び出すことによって)。
- 最後にシグナル ハンドラーから戻ります。通常の例外がスローされたように、プログラムが C++ スタックの巻き戻しプロセスを開始することを願っています。
以下は、GCC のマニュアル ページ (-fnon-call-exceptions) からの引用です。
トラップ命令が例外をスローできるようにするコードを生成します。これには、どこにも存在しないプラットフォーム固有のランタイム サポートが必要であることに注意してください。さらに、トラッピング命令のみが例外をスローすることを許可します。つまり、メモリ参照または浮動小数点命令です。「SIGALRM」などの任意のシグナルハンドラから例外をスローすることはできません。
この「プラットフォーム固有のランタイム」はまさに私が望んでいるもののようです。Linux/x86_64 のそのようなランタイムを知っている人はいますか? または、そのようなランタイムがまだ存在しない場合に、そのようなランタイムを実装する方法に関する情報を教えてください。
ソリューションがマルチスレッドプログラムでも機能することを望みます。