作者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
推 linsung:但si->si_addr 不也可以產生跟2相同的效果? 06/20 13:33
→ roylee17:沒說清楚,context裡存有引發 exception 時,的 hardware 06/20 20:06
→ roylee17:context, 也就是包括暫存器的內容 06/20 20:07
→ roylee17:這些 context 稍後會被回存到暫存器 06/20 20:08