web-dev-qa-db-ja.com

GDB:Ctrl + Cは通常のようにプロセスを中断しませんが、プログラムを終了します

通常、GDBを介してプログラムを実行するときは、Ctrl + Cを押して中断できます。無限ループに陥り、バックトレースを取得したい場合。

私はプログラムをデバッグしています(発生時はxmms2d)。ただし、このプログラムのみで、Ctrl + Cを押すと、GDBが実行されていないかのように扱われ、プログラムは正常にシャットダウンし、GDBはプログラムが正常に終了したことを通知します。

Ctrl + Cがプログラムに割り込む通常のGDB動作を元に戻すにはどうすればよいですか?または、Ctrl + Cと同じようにGDBで同じ反応を生成する別の方法はありますか?

31
Malvineous

Xmms2dがsigwait()を使用してシグナルを処理していることは間違いないでしょう。これにより、gdbのCTRL-Cをキャッチする機能が損なわれます。 https://bugzilla.kernel.org/show_bug.cgi?id=9039 を参照してください

Linuxでのアサーションの失敗後にデバッグを続行しますか? -gdbで中断する準備ができたら、別の端末から "kill -TRAP <pid>"を実行して、回避策のアイデアを得ました窓。

28
Jared Robinson

Gdbプロンプトで「ハンドルSIGINT停止」を実行して、gdbがCTRL-Cをキャッチできるようにします。

8
sunil

Gdbに干渉するSDLシグナルハンドラーが原因で同じ問題が発生しました。 gdbを開始するときにこれを回避するために見つけた1つの解決策:

start
call sigignore(2)
continue

これで、すべてのCTRL-Cがアプリケーションによって無視されます。

attachを何らかのプロセスで実行し、デバッグ後に元の状態に戻したい場合は、次のようにします。

set $oldcallback = signal(2, 0)
call sigignore(2)
continue

そしてあなたが終わったら:

call signal(2, $oldcallback)
detach
4
Yankes

rlwrapの下でGDBを実行すると、^Cを正しくインターセプトする機能が無効になることに注意してください。これを行っている場合は、rlwrapなしで実行してみてください。

0

次のコマンドを使用して、GDBの入出力ターゲットを変更できます。

gdb -tty = /dev/tty1
0
Sanjay