AddressSanitizer 云或分布式测试

无需及时就地调试出现的 AddressSanitizer 错误。 配置运行时以创建故障转储,该转储在发生错误时存储所有特定于 AddressSanitizer 的上下文。 然后,将该故障转储发送到另一台电脑进行调试。 在云中或在分布式测试中运行 AddressSanitizer 时,脱机调试可以节省大量时间。 可以在发生故障的测试或生产基础结构上创建转储,并稍后在开发人员电脑上对其进行调试。

Visual Studio 调试器提供精确诊断的 AddressSanitizer 错误。 无需重新运行测试、复制大型数据集、发现丢失的数据或查找脱机测试计算机即可查看这些 bug。 只需加载故障转储。

通过设置以下环境变量,在 AddressSanitizer 故障时创建故障转储:

set ASAN_SAVE_DUMPS=MyFileName.dmp

注意

文件名必须具有后缀 .dmp 才能遵循 Visual Studio 命名约定。

转储文件可通过稍后在另一台计算机上使用 Visual Studio 来显示。

Visual Studio 可以在原始源代码的上下文中显示错误信息。 为此,Visual Studio 需要调试符号索引源代码。 为了获得最佳调试体验,用于生成这些二进制文件的 EXE、PDB 和源代码必须匹配。

有关存储源和符号的详细信息,请参阅源和符号部分。 有关实现详细信息和精细控制的信息,请参阅调试器集成

示例 - 生成、测试和分析

请考虑三台计算机:A、B 和 C。生成在计算机 B 上完成,测试在计算机 C 上运行,你分析计算机 A 上的故障。根据源代码中的源代码行号和列号报告错误。 可以在 PDB 文件中看到调用堆栈和一组符号,这些符号使用源代码的确切版本生成。

以下步骤适用于导致创建 .dmp 文件的本地或分布式方案,以及脱机查看 AddressSanitizer 转储文件。

在本地生成 .dmp

  • 构建
  • 测试可执行文件
  • 将生成的 .dmp 文件复制到生成目录
  • 在同一目录中,使用配对的 .pdb 打开 .dmp 文件

在分布式系统上生成 .dmp

  • 生成和后处理源索引数据块PDB
  • 将原子对(.exe、.pdb)复制到测试计算机并运行测试
  • 将原子对(.pdb、.dmp)写入 bug 报告数据库
  • Visual Studio 在同一目录中打开具有配对 .pdb 的 .dmp 文件

注意

用于分析的 Visual Studio 2019 计算机必须有权访问 GitHub 或存储索引源的内部 \\Machine\share

查看 AddressSanitizer .dmp 文件

  1. 确保调试器 IDE 可以找到 PDB 和源文件。

  2. 打开 Visual Studio,然后选择“继续但无需代码”。 然后,选择“文件”>“打开”>“文件”以打开“打开文件”对话框。 请确保文件名后缀为 .dmp

    Visual Studio 中“文件”>“打开”>“文件”菜单的屏幕截图。

    此处显示的屏幕还需要一个步骤才能让 IDE 访问符号和源。

  3. 设置符号路径,然后选择“仅本机调试”。

    Visual Studio 中“小型转储摘要”显示的屏幕截图。

此屏幕截图显示最终加载的转储文件,其中加载了源和 AddressSanitizer 元数据。

显示源文件和 AddressSanitizer 元数据的调试器的屏幕截图。

源和符号

源服务器允许客户端检索用于生成应用程序的源文件的确切版本。 可执行文件或 DLL 的源代码可能会随着时间推移和版本的变化而变化。 可以使用它查看生成特定版本应用程序的相同源代码。

使用 PDB 文件调试 EXE 时,调试器可以使用嵌入的源服务器数据块从源代码管理检索相应的文件。 它会加载映射到由 /Zi 编译器选项自动放入 PDB 中的完全限定名称的文件。

若要使用源服务器,应用程序必须使用 pdbstr.exesrcsrv 数据块写入 PDB 文件来“编制源索引”。 有关详细信息,请参阅源服务器和源索引的“数据块”部分。 你会发现编制源索引和发布符号的步骤以及如何为调试器指定符号和源代码也很有用。

有关外部文档,请参阅:

另请参阅

AddressSanitizer 概述
AddressSanitizer 已知问题
AddressSanitizer 生成和语言参考
AddressSanitizer 运行时参考
AddressSanitizer 阴影字节
AddressSanitizer 调试程序集成
AddressSanitizer 错误示例