Windows下捕获对齐检查异常问题求助
Windows下捕获对齐检查异常问题求助
各位大佬好,我最近在Windows平台做对齐检查异常的捕获测试,碰到了个卡壳的问题,想请大家帮忙支个招。
我的需求很明确:执行一个不对齐的内存读写操作,然后用__try/__except块把触发的对齐检查异常给捕获处理掉。我已经手动把RFLAGS寄存器的AC位(对应值0x40000)设为1了,但执行不对齐写操作的时候程序直接崩溃了——哪怕我把这段逻辑整个包在__try块里也没用。
我之前还琢磨着用SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT)来解决,结果查了资料才发现,这个参数是直接把对齐异常给屏蔽了,应用程序根本感知不到异常发生,完全不符合我的测试需求——我要的是能捕获并处理异常,而不是让它直接“消失”。
下面是我目前的测试代码:
ULONG Buffer[4]; PULONG Misaligned = (PULONG)((char*)Buffer + 1); __try { __asm( "pushf;" "popq %rax;" "orq $0x40000, %rax;" "pushq %rax;" "popf;" ); *(ULONGLONG*)Misaligned = (ULONGLONG)0; __asm("pushf;" "popq %rax;" "andq $~0x40000, %rax;" "pushq %rax;" "popf;"); printf("No exception occurred\n"); return FALSE; } __except(EXCEPTION_EXECUTE_HANDLER) { printf("Alignment Check Exception occurred\n"); return TRUE; }
(注:我后来把原来单独的popf改成了恢复AC位的代码,避免影响后续逻辑,但核心问题还是没解决)
想请教下大家:为什么我的__try/__except块抓不到这个对齐检查异常?有没有办法既能触发AC异常,又能让我的异常处理块正常捕获到它,而不是直接导致程序崩溃?
内容来源于stack exchange
相关产品推荐
相关产品推荐

