微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

qt创build者在Linux信号上停止

对于相同的信号有多个信号处理程序是否有效?

在处理程序中阻止新的信号

日志旋转Nginx在Windows上

SIGSTOP不能在c程序中工作

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐