VS2019远程调试Win ARM64 CMake项目触发Access violation报错
问题根因
该异常和代码逻辑完全无关,本质是Visual Studio 2019远程调试时架构识别错误,误用x64调试器解析ARM64目标程序,将ARM64机器码错误解码为x64指令,导致调试执行流、符号匹配完全错乱,最终触发访问违例。
核心佐证有两个:
- 编译出的可执行文件直接在ARM64目标设备上独立运行完全正常,可以正常输出Hello World,说明二进制编译、链接、部署流程没有问题。
- 你看到的反汇编结果完全不符合正常编译产物的特征:连续十几条无意义的
add byte ptr [rax],al填充、大量?? ??????无法解码的指令、main函数入口处出现和C++代码完全不匹配的无效指令,都是指令集被错误解码的典型表现。
排查解决方法
- 检查目标设备上的远程调试器版本:在ARM64设备上启动远程调试服务时,必须运行ARM64版本的
msvsmon.exe,不能使用x64版本的远程调试器。x64调试器不具备ARM64指令解析能力,必然出现解码错乱。 - 校验编译产物架构:在主机的CMake输出目录中找到生成的CMakeARM64.exe,查看PE文件头的机器类型字段,确认是ARM64(AA64)架构,而非AMD64架构。如果编译出的是x64程序,在ARM64设备上靠模拟层运行时也会导致调试器识别错误,这种情况要确认CMakeSettings.json里的
inheritEnvironments字段确实为msvc_arm64_x64,没有错选x64编译环境。 - 修正调试器类型配置:在VS的CMake调试启动配置中,不要手动将调试器类型固定为"原生(x64)",改为"自动"模式;如果自动识别仍然出错,手动强制指定调试器类型为"原生(ARM64)"。
- 清理缓存全量重编:删除目标设备上
C:\Windows Default Deploy Directory\ARM64\路径下的所有旧部署文件,同时删除主机上的CMake build输出目录,执行全量重新编译、部署,避免旧的错误架构文件残留干扰调试器识别。 - 若以上操作后问题仍存在,将Visual Studio 2019更新到16.11最终服务版本即可,早期VS2019版本存在CMake ARM64远程调试的架构识别已知bug。
内容的提问来源于stack exchange,提问作者nightdev123
相关产品推荐
相关产品推荐

