通常、GDBを介してプログラムを実行するときは、Ctrl + Cを押して中断できます。無限ループに陥り、バックトレースを取得したい場合。
私はプログラムをデバッグしています(発生時はxmms2d)。ただし、このプログラムのみで、Ctrl + Cを押すと、GDBが実行されていないかのように扱われ、プログラムは正常にシャットダウンし、GDBはプログラムが正常に終了したことを通知します。
Ctrl + Cがプログラムに割り込む通常のGDB動作を元に戻すにはどうすればよいですか?または、Ctrl + Cと同じようにGDBで同じ反応を生成する別の方法はありますか?
Xmms2dがsigwait()を使用してシグナルを処理していることは間違いないでしょう。これにより、gdbのCTRL-Cをキャッチする機能が損なわれます。 https://bugzilla.kernel.org/show_bug.cgi?id=9039 を参照してください
Linuxでのアサーションの失敗後にデバッグを続行しますか? -gdbで中断する準備ができたら、別の端末から "kill -TRAP <pid>"を実行して、回避策のアイデアを得ました窓。
Gdbプロンプトで「ハンドルSIGINT停止」を実行して、gdbがCTRL-Cをキャッチできるようにします。
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
rlwrap
の下でGDBを実行すると、^C
を正しくインターセプトする機能が無効になることに注意してください。これを行っている場合は、rlwrap
なしで実行してみてください。
次のコマンドを使用して、GDBの入出力ターゲットを変更できます。
gdb -tty = /dev/tty1