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 がハンドル出来ないとか?そんなわけないよなあ。

追記

JIT コンパイル済みのコードでも SIGSEGV ハンドラに来るもの”も”ある事が分かった。違いは何だ。
スタックぶっ壊したとか?