Win10下MSVC编译启用ASAN的程序仅输出前两行报告无完整栈追踪
MSVC 启用ASAN无栈追踪、程序停滞的解决方法
需补充的配置项
- 编译时添加调试符号参数
仅加入/fsanitize=address编译开关无法生成栈追踪,必须同时添加/Zi(生成独立PDB调试文件)或/Z7(调试信息嵌入目标文件)参数,否则ASAN无法将内存地址映射到对应的代码位置。 - 配置ASAN运行时环境变量
MSVC版ASAN默认检测到错误时会触发调试中断,等待调试器附加,这是程序停滞、无后续输出的核心原因,运行程序前先在当前命令行执行以下命令配置环境变量即可解决:
各参数含义:set ASAN_OPTIONS=halt_on_error=1:symbolize=1:win32_ignore_first_chance_exception=1win32_ignore_first_chance_exception=1:MSVC ASAN专属参数,关闭错误触发的调试中断,避免程序挂起symbolize=1:开启地址符号解析,生成可读的栈追踪信息halt_on_error=1:输出完整错误报告后直接终止程序
- 确保符号解析工具在环境路径中
ASAN依赖llvm-symbolizer.exe完成地址到代码行号的转换,该工具随Visual Studio的ASAN组件一同安装,路径为VS安装目录下VC\Tools\MSVC\<你的MSVC版本号>\bin\Host<主机架构>\<目标架构>,需将该路径添加到系统PATH环境变量中,或在ASAN_OPTIONS中补充external_symbolizer_path=<llvm-symbolizer.exe的完整路径>参数。 - 避免过高优化等级
若使用Release模式编译,/O2及更高优化等级可能破坏栈帧结构导致栈追踪生成失败,建议使用/Od(禁用优化)或/O1优化等级编译。
内容的提问来源于stack exchange,提问作者Frederik De Ruyck
相关产品推荐
相关产品推荐

