2012-02-16 18 views
4

私はJITコードの生成を行っていますが、いくつかのメタデバッグを実行するために無効なオペコードをストリームに挿入したいと考えています。命令に当たるまで、すべてがうまくやっています。その時点で、ハンドラとバックにシグナルを送る違法な命令の無限ループに入ります。SIGILLハンドラで、どのように問題の命令をスキップできますか?

悪い命令をスキップするように設定する方法はありますか?

+0

私の無知を許してください...ランタイム機能テストをして、CPUやプラットフォームでサポートされている命令を発行してはいけませんか? – jww

答えて

10

それは非常にハックと移植不可能だが:

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のだ)場合:-)

+0

+1 **非常にハッキーで可搬性はありません** – karlphillip

+0

非常にハッキーですが、今はおそらく十分です。例外の原因となった命令を抽出するためのヒント? siginfo_t.si_addrを見ますか? – Alex

+0

違法命令の問題は、命令ではないため、命令の長さを知ることができないことです。命令の長さはアーキテクチャによって異なり、アーキテクチャー内でも(インテルは可変長命令を持っています)、それは非常にハッキリでなければならないと思います。 –

関連する問題