我要进行JIT代码生成,并且我想在流中插入无效的操作码以执行一些元调试。一切都很好,直到它达到指令,此时东西进入无限循环的非法指令信号处理程序和返回。
有什么方法可以设置简单地跳过坏指令的东西?
答案 0 :(得分:10)
这非常hacky和不可用但是:
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);
如果你知道跳过多远(可以工作)(并且它是Intel proc): - )
答案 1 :(得分:0)
您还可以尝试其他方法(如果适用于您的情况): 您可以使用易于管理的SIGTRAP。
void sigtrap_handler(int sig){
printf("Process %d received sigtrap %d.\n", getpid(),sig);
}
signal(SIGTRAP,sigtrap_handler);
asm("int3"); // causes a SIGTRAP