問題タブ [signal-handling]
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 - SIGSEGVをキャッチするシグナルハンドラーを作成するにはどうすればよいですか?
SIGSEGVをキャッチするためのシグナルハンドラーを作成したいと思います。を使用して読み取りまたは書き込み用にメモリのブロックを保護します
これにより、バッファから始まるページサイズのメモリバイトが読み取りまたは書き込みから保護されます。
第二に、私は記憶を読み込もうとします:
これによりSIGSEGVが生成され、ハンドラーが呼び出されます。ここまでは順調ですね。私の問題は、ハンドラーが呼び出されたら、次のようにしてメモリのアクセス書き込みを変更したいということです。
そして私のコードの通常の機能を継続します。関数を終了したくありません。同じメモリへの今後の書き込みで、信号を再度キャッチし、書き込み権限を変更してから、そのイベントを記録したいと思います。
コードは次のとおりです。
問題は、シグナルハンドラーのみが実行され、シグナルをキャッチした後、メイン関数に戻れないことです。
django - シグナルハンドラーはdjangoプロジェクトのどこに住むべきですか?
djangoプロジェクトでシグナルリスナーの実装を始めたところです。私はそれらが何であるか、そしてそれらをどのように使用するかを理解しています。どこに置けばいいのかわからない。djangoサイトのドキュメントには次のように書かれています。
信号処理と登録コードはどこにでも置くことができます。ただし、信号を送信する前に信号処理が登録されるように、モジュールが含まれているモジュールが早い段階でインポートされていることを確認する必要があります。これにより、アプリのmodels.pyはシグナルハンドラーの登録を行うのに適した場所になります。
それは良い提案ですが、models.pyに非モデルクラスまたはメソッドがあると、間違った方法で私をこすります。
では、シグナルハンドラーを保存および登録するためのベストプラクティス/ルールは何ですか?
iphone - iphone-例外的な状況(信号?)を適切に処理する方法
私のiphoneアプリでは、アプリケーションが終了する前に最終的な作業(機密データの削除)を行う、ある種のアプリ終了ハンドラーを提供したいと思います。
可能な限り多くの終了状況を処理したい:
1)ユーザーがアプリを終了する
2)デバイスのバッテリーがなくなる
3)システムが何らかの理由(メモリ不足やアプリのフリーズなど)でアプリを終了する
4)アプリケーションクラッシュ(EXC_BAD_ACCESSまたはSIGSEGV)
他の例外的な状況はありますか?
これを達成するための最良の方法は何ですか(たとえば、状況2で呼び出されるapplicationWillTerminateメソッドです)?
シグナルハンドラー(iPhoneセキュリティフレームワーク呼び出しを含む)でクリーンアップを実行することは可能ですか?
よろしく
linux - シグナルハンドラーでFPUコンテキストを変更する方法(C ++ / Linux)
FPEエラーをキャッチするためのシグナルハンドラーを作成しました。これが起こっても実行を継続する必要があります。パラメータとしてucontext_tを受け取り、不良オペランドを0から別の値に変更できますが、FPUコンテキストは依然として不良であり、無限ループに陥りますか?
Linuxで誰かがすでにucontext_t構造を操作していますか?
私はついに、次のようにucontext_tのステータスフラグをクリアすることで、これらの状況を処理する方法を見つけました。
0x3Fは、FPU(x87)のステータスレジスタの6ビットに0を入れるために否定されます。これを行うことは、計算後にFPE例外をチェックすることを意味します。
asynchronous - AsyncGetCallTrace を呼び出す SIGPROF ハンドラーを正しく記述する方法は?
さまざまな Java クライアントのスレッドのスタック トレースを定期的に出力することを目的とした、簡潔で単純なプロファイラー (C 言語) を作成しています。侵入を最小限に抑え、スレッドの状態に関係なくスタック トレースを可能にするAsyncGetCallTrace
代わりに、文書化されていない関数を使用する必要があります。GetStackTrace
関数のソース コードは、http: //download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gz
にありhotspot/src/share/vm/prims/forte.cpp
ます。AsyncGetCallTrace
JVMTI、シグナル処理、およびタイミングについて説明しているいくつかのマニュアル ページと、呼び出しの設定方法に関する詳細が記載されたブログを見つけました。 -and.html
このブログに欠けているのは、シグナル ハンドラー内で実際に関数を呼び出すコードです (著者は、読者が自分でこれを実行できると想定しています)。まさにこれを行うための助けを求めています。前述のファイルで定義されているように、 struct ASGCT_CallTrace
(および内部)を作成する方法と場所がわかりません。は に渡されるパラメータの 1 つなので、作成する必要がありますが、そのフィールドの正しい値を取得する方法がわかりません: 、、および。さらに、渡された 3 番目のパラメーターがどうあるべきかわかりませんか?struct ASGCT_CallFrame
forte.cpp
struct ASGCT_CallTrace
AsyncGetCallTrace
JNIEnv *env_id
jint num_frames
JVMPI_CallFrame *frames
AsyncGetCallTrace (void* ucontext)
上記の問題は、私が抱えている主なものです。ただし、私が直面している他の問題には次のものがあります。
SIGPROF
指定された間隔で正確にタイマーによって発生するようには見えませんが、少し頻度が低くなります。つまり、タイマーを毎秒 (1 秒、0 usec) 送信するように設定すると、5 秒の実行でハンドラー出力SIGPROF
が 5 つ未満になります (通常は 1 ~ 3)。SIGPROF
SIGPROF
Thread.sleep
ハンドラの出力は、Java コードの実行中にまったく表示されません。したがって、 aSIGPROF
が毎秒送信され、私が を持っているThread.sleep(5000);
場合、そのコードの実行中にハンドラー出力は取得されません。
どんな助けでも大歓迎です。追加の詳細 (およびコードとサンプル出力の一部) は、リクエストに応じて投稿されます。
linux - Linuxプロセスのアドレス空間のすべてのページを書き込み禁止にすることはできますか?
Linuxプロセスのアドレス空間内のすべてのページを(プロセス自体の内部から)書き込み保護する方法があるかどうか疑問に思っています
mprotect()
。「すべてのページ」とは、実際には、ユーザーモードで実行されている通常のプログラムによって書き込まれる可能性のあるプロセスのアドレス空間のすべてのページを意味します。つまり、プログラムテキスト、定数、グローバル、およびヒープですが、私は定数、グローバル、ヒープだけで満足するでしょう。スタックを書き込み保護したくない-それは悪い考えのようです。
1つの問題は、書き込み保護メモリをどこから始めればよいかわからないことです。特定のpidで使用されているメモリのセクションを示すを見ると/proc/pid/maps
、それらは常にアドレス
0x08048000
とプログラムテキストで始まっているように見えます。(Linuxでは、私が知る限り、プロセスのメモリは、下部にプログラムテキストがあり、その上に定数があり、次にグローバル、次にヒープ、そしてサイズに応じてさまざまなサイズの空きスペースが配置されています。ヒープまたはスタックの先頭に移動し、スタックが仮想アドレスのメモリの先頭から下に向かって成長します0xffffffff
。)ヒープの先頭がどこにあるかを確認する方法があります(を呼び出すとsbrk(0)
、現在の「ブレーク」へのポインタが返されます。つまり、ヒープの最上部)ですが、実際にはヒープがどこから始まるかを知る方法ではありません。
休憩まですべてのページを保護しようとすると0x08048000
、最終的にmprotect: Cannot allocate memory
エラーが発生します。とにかくなぜメモリを割り当てるのかわかりませんmprotect
-そしてGoogleはあまり役に立ちません。何か案は?
ちなみに、これをやりたいのは、プログラムの実行中に書き込まれるすべてのページのリストを作成したいからです。これを行うために考えられる方法は、すべてを書き込み保護することです。ページを作成し、書き込みを試行すると書き込み障害が発生するようにしてから、ページをリストに追加して書き込み保護を削除する書き込み障害ハンドラーを実装します。保護するページとその方法を理解できれば、ハンドラーの実装方法を知っていると思います。
ありがとう!
perl - $SIG{CHLD} を IGNORE またはカスタム シグナル ハンドラに設定せずに子をリープする
接続ごとにフォークするソケットサーバーを作成しようとしています。1 つの小さな注意点を除いて成功しました。私の子プロセスは Net:OpenSSH->capture2() を使用しており、これには $SIG{CHLD} が IGNORE またはカスタム シグナル ハンドラに設定されていないことが必要です。シグナルハンドラを設定したり、親プロセスを wait または waitpid で遅くしたりせずに、どうすれば子を刈り取ることができますか?
ここに私のサーバーコードがあります:
上記のコードを使用すると、すべてが機能しますが、一連のゾンビ プロセスが発生します。追加すると
ゾンビはリープされますが、Net::OpenSSH->capture2() メソッド呼び出しの戻りコードがめちゃくちゃです。私のシグナル ハンドラーが、Net::OpenSSH が適切に動作するために必要なカスタム ハンドラーに干渉していると思いますか?
linux - Linux C および C++: SIGSEGV などのシグナルを処理する場合、他に何をログに記録する必要がありますか?
一部の Linux (Ubuntu) システムで作業し、社内の C および C++ アプリ (gcc) を実行しています。
や など、処理されるシグナルの長いリストがありSIGSEGV
ますSIGINT
。シグナルでは、コールスタックは and を使用して取得backtrace(3)
されbackgrace_symbols(3)
ます。C++ の場合、関数名はabi::__cxa_demangle()
.
私の質問は、これらのシグナルが発生したときに、事後デバッグのためにログに記録するためのより有用な情報を提供する C/C++ API が他にあるということです。それとも、バックトレースだけが「セクシー」なことですか?
c - キーボード シグナル処理、コールバック ハンドラ関数へのパラメータの追加 (Ubuntu、intel)
私はこのコードを持っています:
コールバック関数で追加の引数を渡す方法はありますか? 何かのようなもの:
ありがとうございました
python - Python での次のシグナル処理動作について説明できますか?
次のプログラムがあります。
これに接続するがデータを送信しないクライアント プログラムがあります。問題は、SIGHUP が送信され、「中断されたシステム コール」例外がスローされる場合です。理由はありますか?Python 2.6+ および FreeBSD で発生しています。http://bugs.python.org/issue1975に関連していると思われます。