代码之家  ›  专栏  ›  技术社区  ›  Ruslan PiotrNycz

如何在不向应用程序传递信号的情况下执行步骤?

  •  0
  • Ruslan PiotrNycz  · 技术社区  · 7 年前

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

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

    另一种方法是 handle SIGSEGV ignore 然后 斯蒂皮 接着是另一个 handle 恢复其原始状态的命令。还不明白:甚至不能 define 这是一个“黑匣子”功能,因为信号处理的原始状态可能是非默认的,并且在恢复之后会遇到问题。 si .

    那么,是否有任何简单的方法可以在不继续执行的情况下删除挂起的信号?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mark Plotnick    7 年前

    在GDB中 version 7.9 后来,有一个 queue-signal 让你发出信号的命令(或者如果你发出信号,根本没有信号) 0 作为参数)下次恢复目标时。这里有一些 documentation :

    排队 信号 当线程继续执行时立即传递到当前线程。这个 信号 可以是信号的名称或编号。信号处理必须设置为将信号传递给程序,否则GDB将报告错误。您可以使用 handle 命令。

    或者,如果 信号 为零,当前线程的任何当前排队信号都将被丢弃,当执行恢复时,将不会传递任何信号。

    此命令与 signal 命令中的信号只是排队,执行不会恢复。和 排队信号 不能用于传递处理状态设置为的信号 nopass .

    推荐文章