MSVC使用Address Sanitizer编译Qt项目启动报错是什么原因?
问题结论
该问题同时符合情况1:Address Sanitizer使用不当和情况3:Qt已知适配问题,不属于Qt本身需要排查的功能缺陷。
原因说明
- Address Sanitizer(ASAN)的运行机制要求所有加载到进程中的二进制文件(包括你的业务代码、依赖的Qt动态库、其他第三方依赖库)必须统一开启或关闭ASAN编译,禁止混合两种状态。你仅对自身项目开启ASAN,使用的官方预编译Qt库未开启ASAN,就会触发跨模块内存操作的检测异常。
- 你遇到的
bad-malloc_usable_size报错是典型的混合编译场景问题:未开启ASAN的Qt库内部分配的内存没有ASAN运行时要求的元数据标记,ASAN在尝试查询这块内存的分配信息时找不到对应记录,就会判定为野指针触发崩溃。
解决方案
- 方案1:如需对全链路开启ASAN检测,需要使用带ASAN编译参数的配置重新编译所有用到的Qt库以及其他第三方依赖,保证所有二进制模块的ASAN状态统一。
- 方案2:如果不需要检测Qt本身的内存问题,可以通过配置
ASAN_OPTIONS环境变量过滤对应报错,示例配置:
也可以根据需要补充关闭泄漏检测等规则减少不必要的误报。ASAN_OPTIONS=detect_malloc_usable_size=0 - 方案3:仅需检测自有代码内存问题时,可替换为MSVC原生的内存诊断工具、或者Qt Creator内置的分析工具,避开ASAN的跨模块兼容限制。
内容的提问来源于stack exchange,提问作者Alex Guteniev
相关产品推荐
相关产品推荐

