2012-02-16 55 views
4

我正在進行JIT代碼生成,並且我想將無效的操作碼插入流中以執行一些元調試。一切都很好,直到它觸及指令,此時該事件進入一個無限循環的非法指令來處理信號並返回。在SIGILL處理程序中,如何跳過違規指令?

有沒有什麼辦法可以將事情設置爲簡單地跳過錯誤的指令?

+0

原諒我的無知......你不應該做一個運行時功能測試,然後發出CPU或平臺支持的指令嗎? – jww 2016-05-29 23:20:46

回答

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 2012-02-16 17:09:58

+0

非常黑客,但現在可能已經足夠了。提取導致異常的指令的任何提示?看看siginfo_t.si_addr? – Alex 2012-02-16 17:39:17

+0

非法說明的問題是,你不能告訴指令長度,因爲它是沒有指令:-)。而且由於體系結構之間的指令長度不同,甚至在體系結構之間(英特爾有不同長度的指令),我認爲這樣的事情必須非常黑客。 – 2012-02-16 17:42:31