Linux:窥探信号而不会破坏后续核心转储的寄存器?

gim*_*ilk 5 linux gdb coredump signals

当我得到coredump-cause信号时,我想运行自己的处理程序将siginfo_t和ucontext_t结构复制到全局变量,以便可以在核心转储中访问它们.目前在我的处理程序结束时,我重新分配默认处理程序并调用raise(thesig).这样做的问题是核心转储"信息寄存器"显示了我的处理程序中寄存器的状态,而不是原始信号时的状态.我意识到,因为我已经保存了ucontext_t,我可以查看原始寄存器值,但是当核心转储在团队中传递时,这些知识可能会丢失/遗忘.

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

Emp*_*ian 3

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

如果您在处理程序中重新发出信号,则无需复制任何内容 - 这些值将位于堆栈上并可在核心转储中访问。

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

只要这样做up 5(或者不管你需要升级多少级才能达到崩溃点),然后info reg再做。

有没有办法重新引发信号,并确保核心转储文件保存原始信号的寄存器状态?

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