Visual Studio AddressSanitizer 扩展功能库 (VCAsan)

VCAsan*.lib 库在 Visual Studio 中实现了扩展的调试器 IDE 功能。 这些功能允许 IDE 在实时调试会话中显示 AddressSanitizer 错误,或者通过保存带有元数据的故障转储文件离线显示。 只要 MSVC 编译器启用 AddressSanitizer,就会链接该库。

VCAsan 库清单

运行时选项 VCAsan 链接库
/MT libvcasan.lib
/MD vcasan.lib
/MTd libvcasand.lib
/MDd vcasand.lib

VCAsan 库功能

Visual Studio IDE 中丰富的 AddressSanitizer 错误报告窗口

VCAsan 库使用接口函数 __asan_set_error_report_callback 在 AddressSanitizer 运行时中注册回调。 如果生成了 AddressSanitizer 报告,则此回调用于引发 Visual Studio 捕获的异常。 Visual Studio 使用异常数据生成在 IDE 中向用户显示的消息。

注意

VCAsan 库在 AddressSanitizer 运行时中注册回调函数。 如果代码第二次调用此注册函数,它将覆盖 VCAsan 库回调注册。 这会导致所有 Visual Studio IDE 集成丢失。 你将恢复为默认 IDE 用户体验。 注册回调的用户调用也可能丢失。 如果遇到任一问题,请提交 bug

在新型故障转储文件中保存 AddressSanitizer 错误

将 VCAsan 库链接到可执行文件时,用户可以使其在运行时生成故障转储。 然后,AddressSanitizer 运行时在出现诊断错误时生成转储文件。 若要启用此功能,用户可以使用如下命令设置 ASAN_SAVE_DUMPS 环境变量:

set ASAN_SAVE_DUMPS=MyFileName.dmp

文件必须具有 .dmp 扩展名才能遵循 Visual Studio IDE 约定。 (版本低于 17.7)

以下是为 ASAN_SAVE_DUMPS 指定转储文件时发生的情况:如果 AddressSanitizer 运行时捕获到错误,它会保存一个故障转储文件,其中包含与该错误关联的元数据。 Visual Studio 版本 16.9 及更高版本中的调试器可以分析保存在转储文件中的元数据。 可以基于每个测试设置 ASAN_SAVE_DUMPS,存储这些二进制项目,然后在 IDE 中使用适当的源索引来查看它们。

Visual Studio 17.7 及更高版本支持以下项:

  • 现在正确处理带引号的字符串。 在以前的版本中,对于 Visual Studio 内部的环境或在使用 PowerShell 时,将环境变量设置为包含引号或空格将无法创建预期的转储文件。

  • 显式指定 .dmp 扩展(例如 set ASAN_SAVE_DUMPS=MyDmp.dmp)时,VCAsan 会显式使用它,并且不会将关联的进程 ID 添加到转储文件名。

  • 如果 .dmp 文件已存在且名称与环境变量中指定的名称相同,VCAsan 将修改文件名,如下所示:

    • 向括号中的文件名追加一个数字。 例如 Myfile (1).dmp
    • 如果在多次尝试后,在括号中追加数字无法生成唯一名称,该文件将保存到 VCAsan 将打印的 %APPLOCAL% 临时路径。 例如 C:\Users\~\AppData\Local\Temp\Dump.dmp
    • 如果未能保存到临时路径,将显示诊断错误。

另请参阅

AddressSanitizer 概述
AddressSanitizer 已知问题
AddressSanitizer 生成和语言参考
AddressSanitizer 运行时参考
AddressSanitizer 阴影字节
AddressSanitizer 云或分布式测试
AddressSanitizer 错误示例