11

ハードウェアとのインターフェースが必要な C++ の Linux でアプリケーション (実際にはサービス/デーモン) を開発しています。私のプログラムが終了時にこのハードウェアのリソースをきれいに解放しない場合、デバイス ドライバーをリロードする必要があります。このプロセスには約 10 分かかり、明らかな理由で、プログラムの各テストの間に 10 分間待たなければなりません。イライラする。

そのため、関数を使用しsigaction()て SIGINT (ctrl-c) をキャッチし、終了時にプログラムを完全にシャットダウンできるようにしました。コンソールからプログラムを実行すると、これは正常に機能します。ただし、Netbeans または Eclipse (私は両方を試しました) でデバッグすると、うまくいきません。

  • Eclipse では、提供されるコンソールで ctrl-c を押しても、SIGINT が発生したことが登録されていないようです。
  • Eclipse で、プログラムをデバッグ モードで実行してから を使用するkill -SIGINT <pid>と、プログラムはブレークポイントにヒットしたかのように中断します。
  • コンソールで ctrl-c を押すと、Netbeans は実際にシグナルが送信されたことを認識しているようで、アプリケーションに転送するかどうかを尋ねるダイアログが表示されます。「転送して続行」をクリックすると、プログラムが壊れているように見え、信号がアプリケーションによって受信されません。また、存在しないメニュー項目である [デバッグ] -> [Dbx 構成] で、この内容を構成できるとも書かれています。
  • Netbeans で、デバッグ モードでプログラムを実行してから を使用するkill -SIGINT <pid>と、動作は上記と同じです。
  • 次に、SIGQUIT ハンドラーを追加しkill、Netbeans でのデバッグ時にそれを送信しようとしました。今回は、ダイアログは表示されず、シグナル ハンドラはトリップしません。

デバッグ中にアプリを完全にシャットダウンする方法が必要です。何か案は?

4

3 に答える 3

10

この問題は、Netbeans や Eclipse とは関係なく、gdb に関係していたことが判明しました。

gdb は、さまざまな方法でシグナルを処理するように構成できます。実行する場合:

gdb

次のように入力します。

info signals

シグナルとそのシグナルを受信した場合に何をすべきかについての gdb アクションのリストを取得します。

Signal        Stop      Print   Pass to program  Description

SIGHUP        Yes       Yes     Yes              Hangup
SIGINT        Yes       Yes     No               Interrupt
SIGQUIT       Yes       Yes     Yes              Quit
SIGILL        Yes       Yes     Yes              Illegal instruction
SIGTRAP       Yes       Yes     No               Trace/breakpoint trap

等...

私の一時的な回避策は、gdb がデフォルトで壊れずにプロセスに送信する SIGALRM を使用することでした。ただし、これらを設定できる .gdbinit ファイルを作成することで、デフォルトの gdb 設定をカスタマイズすることもできます。

于 2011-06-27T11:12:25.097 に答える
2

簡単な解決策.. DEBUG マクロを使用して状況を処理してみてください。

// Register the signal handler to stop service.
#ifdef _DEBUG
        signal(SIGKILL, <your signal handler>);
#endif

また、終了する前にアプリのクリーンアップを試みることもできます。

于 2011-05-26T11:19:50.907 に答える