当我得到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
的指令将重新启动,现在将立即引起核心转储。