GDB: Ctrl+C doesn't interrupt process as it us

2019-01-22 18:11发布

Normally when you run a program through GDB you can press Ctrl+C to interrupt it, e.g. if it gets stuck in an infinite loop and you want to get a backtrace.

I'm debugging a program (xmms2d as it happens) but in this program only, when I press Ctrl+C it gets treated as if GDB was not running - the program shuts down cleanly and then GDB tells me the program exited normally.

How do I get the usual GDB behaviour back, where Ctrl+C interrupts the program? Or is there another way to produce the same reaction in GDB as a Ctrl+C normally does?

标签: gdb signals
5条回答
Evening l夕情丶
2楼-- · 2019-01-22 18:47

In the gdb prompt you can do "handle SIGINT stop" so that gdb catches CTRL-C

查看更多
迷人小祖宗
3楼-- · 2019-01-22 18:54

I had same problem caused by SDL signal handlers that interfere with gdb. One solution I find to workaround this when starting gdb:

start
call sigignore(2)
continue

Now all CTRL-C will be ignored by application.

If you attach to some process and want to restore it to original condition after debuging, you can do this:

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

And when you are done:

call signal(2, $oldcallback)
detach
查看更多
我命由我不由天
4楼-- · 2019-01-22 19:00

You can change GDB's input/output target using the following command:

gdb -tty = /dev/tty1
查看更多
来,给爷笑一个
5楼-- · 2019-01-22 19:08

Note that running GDB under rlwrap breaks its ability to intercept ^C correctly. If you are doing this, then try running it without rlwrap.

查看更多
劳资没心,怎么记你
6楼-- · 2019-01-22 19:09

I'll bet that xmms2d is using sigwait() to handle signals, which breaks gdb's ability to catch CTRL-C. See https://bugzilla.kernel.org/show_bug.cgi?id=9039

I got an idea for a workaround by reading Continue to debug after failed assertion on Linux? -- when I'm ready to break in gdb, I run "kill -TRAP <pid>" from another terminal window.

查看更多
登录 后发表回答