如何在不通过信号的情况下进行申请?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不通过信号的情况下进行申请?相关的知识,希望对你有一定的参考价值。

假设在GDB下运行的进程由于接收到信号而停止,例如SIGSEGV由于访问无效的位置。然后我修复了位置(通过写入寄存器或以任何其他方式)并且想要单步执行,重试错误指令。

有一个命令stepi,如果信号被忽略或者首先没有被接收,它将起作用。但由于有一个待处理的信号,我不能使用它,至少是直接使用它。如果我使用signal 0命令,它将忽略该信号,但它然后作为continue。因此,如果我使用signal 0,我必须找出下一条指令开始的位置,在其上添加一个tb等。这是不方便的。

另一种方式是像handle SIGSEGV ignore跟随stepi,然后是另一个handle命令恢复其原始状态。同样不方便:甚至连define都没有这个“黑匣子”功能,因为信号处理的原始状态可能是非默认的,并且在si之后恢复它会有困难。

那么,有没有简单的方法来删除未决信号而不继续执行?

答案

在gdb version 7.9及更高版本中,有一个queue-signal命令可以让你在下次恢复目标时发送一个信号(或者根本没有信号,如果你把0作为参数)。这是一些documentation

当线程执行恢复时,队列信号立即传递给当前线程。信号可以是信号的名称或编号。必须设置信号处理以将信号传递给程序,否则GDB将报告错误。您可以使用handle命令控制来自GDB的信号处理。

或者,如果signal为零,则丢弃当前线程的任何当前排队信号,并且当执行恢复时,将不传送任何信号。

此命令与signal命令的不同之处在于信号刚刚排队,执行不会恢复。并且queue-signal不能用于传递处理状态已设置为nopass的信号。

以上是关于如何在不通过信号的情况下进行申请?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不与 MainActivity 交互的情况下从通知中打开片段页面?

如何在不创建新片段的情况下显示片段?

请问SAP为啥不能控制:已经审批的采购申请,在不反审批的情况下,可以被删除?

如何在不锁定活动方向的情况下锁定片段方向?

如何在不复制片段的情况下传递道具

如何在不声明 32 个插槽的情况下将 32 个按钮的 press() 信号连接到单个函数?