SIGSEGV がうまくハンドルできない
JIT コンパイルされたコードの VM インストラクション毎にスタックトレース用に情報を push しておいて、SIGSEGV が起きたら直近のスタックトレースを出す機能を作っている。
SIGSEGV をハンドルするように sigaction でセットして試しに直後に
uintptr_t* p = (uintptr_t*)3; *p = 1;
とかやるとすぐにハンドラに来る。一方 JIT コンパイル済みのコードで SIGSEGV が起きてもハンドラに来ない。これはなぜ。GDB で見ると間違いなく SIGSEGV 。
疑ったのは
- setjmp 。念のため sigsetjmp で置き換えてみたが変わらず。
- pthread 周り。スレッドは起動していない。libpthread がリンクされているだけの状態なので関係ない?
うーん mprotect で実行可能にしたメモリでの SIGSEGV がハンドル出来ないとか?そんなわけないよなあ。