如何在不通过信号的情况下进行申请?
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 交互的情况下从通知中打开片段页面?