Linux:窥探一个信号,而不是为随后的核心转储废弃寄存器?

当我得到coredump导致的信号,我想运行我自己的处理程序将siginfo_t和ucontext_t结构复制到全局variables,以便它们可以在核心转储中访问。 目前在我的处理程序结束时,我重新分配了默认处理程序并调用raise(thesig)。 这样做的问题是核心转储“信息寄存器”显示我的处理程序中的寄存器的状态,而不是在原始信号的时间。 我意识到,既然我已经保存了ucontext_t,那么我可以查看原始寄存器值,但是当核心转储通过团队时,知识可能会丢失/遗忘。

所以我的问题是:是否有一种方法来重新调整信号,并确保核心转储文件保存原始信号的寄存器状态? 我想也许我可以使用一些内联asm来手动恢复处理程序末尾的所有regs,然后返回到导致信号而不是调用raise()的指令,但是我不确定是否可以保证re试图执行指令将导致与第一次尝试相同的信号行为。

将siginfo_t和ucontext_t结构复制到全局变量,以便它们可以在核心转储中被访问

如果您在处理程序中重新发出信号,则不需要复制任何内容 – 值将堆栈并在核心转储中可访问。

“信息寄存器”显示我的处理程序中的寄存器的状态,而不是在原始信号的时间。

只要做up 5 (或无论你需要加强到达崩溃点)和info reg再次。

有没有一种方法来重新产生信号,并确保核心转储文件保存原始信号的寄存器状态?

是:使用signal(signum, SIG_DFL);将信号配置设置为SIG_DFL signal(signum, SIG_DFL); 并从你的处理程序返回。 导致SIGSEGV的指令将重新启动,现在将立即引起核心转储。