Re: [問題] signal 與 使用 SIGSEGV 的問題

看板LinuxDev作者 (把我id還我阿......)時間17年前 (2008/06/20 01:08), 編輯推噓1(103)
留言4則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

06/20 13:33, , 1F
但si->si_addr 不也可以產生跟2相同的效果?
06/20 13:33, 1F

06/20 20:06, , 2F
沒說清楚,context裡存有引發 exception 時,的 hardware
06/20 20:06, 2F

06/20 20:07, , 3F
context, 也就是包括暫存器的內容
06/20 20:07, 3F

06/20 20:08, , 4F
這些 context 稍後會被回存到暫存器
06/20 20:08, 4F
文章代碼(AID): #18MfAPli (LinuxDev)
文章代碼(AID): #18MfAPli (LinuxDev)