我正在开发Ubuntu Linux
上的项目,当我使用GDB
调试应用程序并被CTRL + Z
破坏时,得到了SIGTSTP
和GDB
中断。
但是在那之后使用cont
时,我仍然得到SIGTSTP
,我重复了很多次cont
,但是接缝的行为相同,只是反复给我SIGTSTP
。
以下两个调用堆栈或重复执行:
The call stack is as following alterativly:
Program received signal SIGTSTP, Stopped (user).
[Switching to Thread 0x7fffef73d700 (LWP 32591)]
0x00007ffff636dffd in read () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt
#0 0x00007ffff636dffd in read () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff6301ff8 in _IO_file_underflow () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007ffff630303e in _IO_default_uflow () from /lib/x86_64-linux-gnu/libc.so.6
#3 0x00007ffff62f718a in _IO_getline_info () from /lib/x86_64-linux-gnu/libc.so.6
#4 0x00007ffff62f606b in fgets () from /lib/x86_64-linux-gnu/libc.so.6
... .... .... ....
#11 0x00007ffff664ee9a in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#12 0x00007ffff637b3fd in clone () from /lib/x86_64-linux-gnu/libc.so.6
#13 0x0000000000000000 in ?? ()
(gdb) c
Continuing.
Program received signal SIGTSTP, Stopped (user).
[Switching to Thread 0x7fffeef3c700 (LWP 32592)]
0x00007ffff6374763 in select () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt
#0 0x00007ffff6374763 in select () from /lib/x86_64-linux-gnu/libc.so.6
... ... ... ...
#6 0x00007ffff664ee9a in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#7 0x00007ffff637b3fd in clone () from /lib/x86_64-linux-gnu/libc.so.6
#8 0x0000000000000000 in ?? ()
那有什么理由吗?谢谢。
最佳答案
gdb
通常(可配置)安排停止程序并在程序即将接收信号时重新获得终端的控制权。
当您恢复执行时,gdb
通常(可配置)将信号发送给程序。
可以使用info signals
命令查看设置。
(gdb) info signals
Signal Stop Print Pass to program Description
SIGINT Yes Yes No Interrupt
...
SIGTSTP Yes Yes Yes Stopped (user)
...
在这种情况下,
continue
将继续执行该程序而不向其发送任何信号。 continue
将在带有SIGTSTP信号的情况下恢复该程序,因此它将立即再次停止。如果再次键入continue
,它将继续。 有两种方法可以在不向其传递SIGTSTP信号的情况下恢复程序。
第一种是使用
handle SIGTSTP nopass
命令,该命令会将“传递给程序”标志更改为“否”。第二种是使用
signal
命令而不是continue
。从内置帮助中:(gdb) help signal
Continue program with the specified signal.
Usage: signal SIGNAL
The SIGNAL argument is processed the same as the handle command.
An argument of "0" means continue the program without sending it a signal.
This is useful in cases where the program stopped because of a signal,
and you want to resume the program while discarding the signal.
因此,
signal 0
将继续执行该程序,而不会向其传递SIGTSTP信号。