You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:29:31