作者roylee17 (把我id还我阿......)
看板LinuxDev
标题Re: [问题] signal 与 使用 SIGSEGV 的问题
时间Fri Jun 20 01:08:40 2008
※ 引述《linsung (哈)》之铭言:
: 我主要是使用signal 的sigaction,
: 在设定去抓取SIGSEGV这个讯号让handler处理相关动作时,
: 为何产生无限回圈,导致output不停地印出"SIGSEGV !" ?
: 正常来说,不是跑完handler後就会跳回原来的执行位置上吗?
^^^^^^^^^^^^^^^^
也就是引发该 exception 的指令
於是,又再一次引发 exception..
想继续执行的话,可以在你的 handler 中
1. 把 ctx 转成 ucontext_t, mcontext_t (google 一下)
2. 从里面抓出引发 exception 的指令位置
3. 算出该道指令的长度,加回 program counter 即可
其中的 3. 在 RISC 做很简单,但是 CISC 的话
就需要 decode 它的 op code 了
像 qemu, 或是 gnu binutils 里面有可以参考/现成的
: 另外,我的情形不太适合用 longjmp 跟 setjmp ...
: ps: 我只有使用 SIGSEGV 时才会发生无限回圈的情形
: 以下是我写的范例程式,请各位参考看看:
: #include <stdio.h>
: #include <signal.h>
: #include <sys/mman.h>
: typedef struct my_vm{
: char *ptr;
: }myvm;
: void segv_handler (int signum, siginfo_t *si, void *ctx)
: {
: printf("SIGSEGV !\n");
: sleep(1);
: }
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.228.25
1F:推 linsung:但si->si_addr 不也可以产生跟2相同的效果? 06/20 13:33
2F:→ roylee17:没说清楚,context里存有引发 exception 时,的 hardware 06/20 20:06
3F:→ roylee17:context, 也就是包括暂存器的内容 06/20 20:07
4F:→ roylee17:这些 context 稍後会被回存到暂存器 06/20 20:08