我正在進行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 2012-02-16 17:09:58
非常黑客,但現在可能已經足夠了。提取導致異常的指令的任何提示?看看siginfo_t.si_addr? – Alex 2012-02-16 17:39:17
非法說明的問題是,你不能告訴指令長度,因爲它是沒有指令:-)。而且由於體系結構之間的指令長度不同,甚至在體系結構之間(英特爾有不同長度的指令),我認爲這樣的事情必須非常黑客。 – 2012-02-16 17:42:31
原諒我的無知......你不應該做一個運行時功能測試,然後發出CPU或平臺支持的指令嗎? – jww 2016-05-29 23:20:46