2017-12-14 17 views
0

clionでのデバッグ中に、実行中のプログラムを停止する「停止」ボタン(赤い四角)があります。現在、私はテストを書いており、それらをデバッグしようとしています。私のテストケースでは一時的なディレクトリとファイルを作成し、後で整理する必要がありますが、ボタンを押してもデストラクタやシグナルハンドラは呼び出されません。"stop"ボタンを押すと、clion内のバンドルされたGDBから発信されたシグナルを捕まえる方法は?

これは、(私が実際にGDBによって使用されているか分からないため、それらの多く)私は信号を処理する方法である:

DLOG_S(INFO) << "Registering signal handlers for test files cleanup"; 
if (signal(SIGABRT, TemporaryDirectory::handle_cleanup) == SIG_ERR) 
    DLOG_S(INFO) << "Registering SIGABRT failed"; 
if (signal(SIGTERM, TemporaryDirectory::handle_cleanup) == SIG_ERR) 
    DLOG_S(INFO) << "Registering SIGTERM failed"; 
if (signal(SIGINT, TemporaryDirectory::handle_cleanup) == SIG_ERR) 
    DLOG_S(INFO) << "Registering SIGINT failed"; 
if (signal(SIGALRM, TemporaryDirectory::handle_cleanup) == SIG_ERR) 
    DLOG_S(INFO) << "Registering SIGALRM failed"; 

そして、これが(静的である)私のハンドラメソッドです:

void test_utils::TemporaryDirectory::handle_cleanup(int signo) { 
    DLOG_S(INFO) << "Received signal " << signo; 
    if (signo == SIGABRT || signo == SIGTERM || signo == SIGINT || signo == SIGALRM) { 
     DLOG_S(INFO) << "Cleaning up test files"; 
     TemporaryDirectory::test_files_root().cleanup(); 
    } 
} 

ログに登録エラーメッセージはありませんが、実際に処理されている信号はありません。

また、GDBコンソールでhandle all nostopと入力して設定を変更しようとしましたが、それを実行してもアプリケーションが停止するだけです。

clionのバンドルされたGDBが停止した後にクリーンアップする方法はありますか?

+0

[停止ボタンによって送信された信号](https://intellij-support.jetbrains.com/hc/en-us/community/posts/203374490-Signal -sent-by-stopping-button) –

+0

@ MarkPlotnickはい、私は信号を送信しているのはGDBだと認識しています。しかし、クリオンのボタンを押すと、私には謎が伝わってきます。また、スタンドアロンのGDBとは異なる動作をするバンドルされたGDBがあるので、タグにclionを追加しました。 – Jezor

+0

また、上記のように、私はすでに 'SIGTERM'を無駄に処理しようとしました。 – Jezor

答えて

1

:ターゲットが既に停止されていない場合

  • 、ターゲット・プロセスにSIGINT信号を送って、次いで
  • -gdb-exitコマンドを送信キャッチできない、無視できないSIGKILL信号と標的を殺すGDBもたらす
  • はGDBにkillコマンドを送信した信号を、受信したターゲット約GDBからの応答を、もしあれば、読み取りgdbに、 gdbを終了させます。

SIGINTが送信され、プログラムにSIGINTハンドラがあり、gdbがターゲットにシグナルを渡すように設定している場合は、 handle SIGINT pass nostop noprintの場合、ターゲットはSIGINTハンドラを実行しますが、killコマンドで1秒後に殺されます。

あなたがプログラムにシグナルハンドラを呼び出すことによってクリーンアップするチャンスを与えたい場合は、あなたがsignalコマンドを使用して、お好みの信号を送信するために、GDBのkillコマンドを再定義することができます:

define kill 
    signal SIGTERM 
    shell sleep 5 
end 

(OP shell sleep 5を必要とせずに問題なく機能していると言いました。

0

gdbでシグナルを処理するには、デバッグセッションでhandle signal keywords...を使用します。詳細:https://sourceware.org/gdb/onlinedocs/gdb/Signals.html

Btw;それはあなたにシグナルを送るgdbではなく、カーネルです。私の知る限りは、プログラムのデバッグ中にあなたがStopボタンをクリックすると、CLionがなり、言うことができるように

+0

ポイントは、私はGDBが停止時に送信している信号を知りません。私は 'handle nostop'コマンドを試しました。私の理解では、アプリケーションからのシグナルを処理させるべきですが、動作しません。 – Jezor

+0

また、GDBがシグナルを送信しているかどうかもわかりませんが、サンドボックス環境でアプリケーションを実行して警告なしで殺すようです。 – Jezor

関連する問題