私はJITコードの生成を行っていますが、いくつかのメタデバッグを実行するために無効なオペコードをストリームに挿入したいと考えています。命令に当たるまで、すべてがうまくやっています。その時点で、ハンドラとバックにシグナルを送る違法な命令の無限ループに入ります。SIGILLハンドラで、どのように問題の命令をスキップできますか?
悪い命令をスキップするように設定する方法はありますか?
私はJITコードの生成を行っていますが、いくつかのメタデバッグを実行するために無効なオペコードをストリームに挿入したいと考えています。命令に当たるまで、すべてがうまくやっています。その時点で、ハンドラとバックにシグナルを送る違法な命令の無限ループに入ります。SIGILLハンドラで、どのように問題の命令をスキップできますか?
悪い命令をスキップするように設定する方法はありますか?
それは非常にハックと移植不可能だが:
void sighandler (int signo, siginfo_t si, void *data) {
ucontext_t *uc = (ucontext_t *)data;
int instruction_length = /* the length of the "instruction" to skip */
uc->uc_mcontext.gregs[REG_RIP] += instruction_length;
}
はそのようなsighandler
をインストール:
struct sigaction sa, osa;
sa.sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO;
sa.sa_sigaction = sighandler;
sigaction(SIGILL, &sa, &osa);
が仕事ができることをあなたはスキップするどこまで知っている(と、それはインテルのprocのだ)場合:-)
+1 **非常にハッキーで可搬性はありません** – karlphillip
非常にハッキーですが、今はおそらく十分です。例外の原因となった命令を抽出するためのヒント? siginfo_t.si_addrを見ますか? – Alex
違法命令の問題は、命令ではないため、命令の長さを知ることができないことです。命令の長さはアーキテクチャによって異なり、アーキテクチャー内でも(インテルは可変長命令を持っています)、それは非常にハッキリでなければならないと思います。 –
私の無知を許してください...ランタイム機能テストをして、CPUやプラットフォームでサポートされている命令を発行してはいけませんか? – jww