为什么每次使用' cont'命令?

时间:2014-06-25 11:41:54

标签: linux api linux-kernel gdb pthreads

我正在Ubuntu Linux上开展一个项目,当我使用GDB调试应用程序并按CTRL + Z进行调整时,我得到了SIGTSTPGDB按预期中断。

但是当我在那之后使用cont时,我仍然会SIGTSTP,我会重复cont很长一段时间,但接缝它只是行为相同,只是反复给我{ {1}}。

跟随两个调用堆栈或者重复:

SIGTSTP

那么有什么理由吗?感谢。

2 个答案:

答案 0 :(得分:5)

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)
...

在这种情况下,

  • 输入 Ctrl-C 将停止该程序,continue将恢复该程序而不向其发送任何信号。
  • 输入 Ctrl-Z 将停止程序,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信号传递给它的情况下恢复该程序。

答案 1 :(得分:0)

我通常使用Ctrl + C(SIGINT)来插入正在运行的进程并设置断点。

我认为这会有所帮助 http://web.mit.edu/gnu/doc/html/gdb_toc.html#SEC40