2013-03-27 59 views
3

我正试图捕获GDB中的浮点异常(SIGFPE),而不是将它传递给进程并继续调试。 我给GDB这样的:当一个SIGFPE发生GDB停止在正确的位置GDB:捕获信号并继续调试

handle SIGFPE stop nopass 

。问题是我不能也不知道如何继续调试。 我试图让GDB

continue 

signal 0 

,但它仍然挂在违规线,并拒绝继续。

有没有办法在接收到信号后继续调试?

我使用的是GDB 7.5.1,这是我自己编译的,我也尝试过使用我的12.04 Ubuntu发行版的GDB 7.4。两者都有相同的行为。

回答

6

的问题是,当你同步信号后继续执行程序,它重新执行引起的信号,这意味着你会再次得到信号相同的指令。如果您告诉它忽略该信号(直接或通过gdb),它将进入一个紧密的循环,重复执行该指令。

如果您想在导致信号的指令之后的某个地方实际上继续执行程序,则需要在发出continue命令之前手动将$pc寄存器设置为下一个(或其他)指令。

+0

谢谢你的洞察力。采取你所说的话,我试图让GDB在处理接收到的信号后继续“处理SIGFPE nostop nopass”,然后试图继续,因此它在我恢复后第二次忽略信号。但是GDB接缝在此之后就会挂起,它甚至不能再次停顿。这将是非常简单的解决方案,现在我必须手动移动程序计数器。 – Sogartar 2013-03-27 17:28:29

+0

那么这意味着没有办法以完全相同的方式执行程序而不跳过指令? – Sogartar 2013-03-27 17:38:01

+0

@Sogartar你确实以完全相同的方式执行......并得到完全相同的结果。 – Ruslan 2017-06-29 11:32:52