配置 Linux 项目以使用地址擦除器

在 Visual Studio 2019 版本 16.1 中,AddressSanitizer (ASan) 支持已集成到 Linux 项目。 可以为基于 MSBuild 的 Linux 项目和 CMake 项目启用 ASan。 它可在远程 Linux 系统和适用于 Linux 的 Windows 子系统 (WSL) 上运行。

关于 ASan

ASan 是 C/C++ 的运行时内存错误检测器,可捕获以下错误:

  • 释放后使用(无关联的指针引用)
  • 堆缓冲区溢出
  • 堆栈缓冲区溢出
  • 返回后使用
  • 审视后使用
  • 初始化顺序 bug

当 ASan 检测到错误时,它会立即停止执行。 如果在调试程序中运行启用了 ASan 的程序,系统会显示一条消息,其中描述了错误类型、内存地址以及源文件中发生错误的位置:

屏幕截图展示地址擦除器错误消息:释放后使用堆。

还可以在输出窗口的“调试”窗格中查看完整的 ASan 输出(包括分配/取消分配损坏内存的位置)。

为基于 MSBuild 的 Linux 项目启用 ASan

注意

从 Visual Studio 2019 版本 16.4 开始,可通过“项目属性”“配置属性”>“C/C++”“启用地址擦除”来启用适用于 Linux 项目的 AddressSanitizer。

要为基于 MSBuild 的 Linux 项目启用 ASan,请右键单击“解决方案资源管理器”中的项目,然后选择“属性” 。 接下来,导航到“配置属性”“C/C++”>“擦除器” 。 ASan 通过编译器和链接器标志启用,并且需要重新编译项目才能正常运行。

项目属性页面的屏幕截图,其中已选中“配置属性”>“C++”>“擦除器”。“启动地址擦除器”设置为“是”。

可通过导航到“配置属性”“调试”>“AddressSanitizer 运行时标志”,传递可选 ASan 运行时标志 。 单击向下箭头,添加或删除标志。

项目属性页面的屏幕截图,其中已选中“配置属性”>“调试”。地址擦除器运行时标志为 detect_leaks = 0

为 Visual Studio CMake 项目启用 ASan

注意

若要使用 CMake 预设进行生成,请先在 CMakeLists.txt 文件中启用 ASan。 有关详细信息,请参阅为 Windows 和 Linux 启用 AddressSanitizer

要为 CMake 启用 ASan,请右键单击“解决方案资源管理器”中的 CMakeLists.txt 文件,然后选择“项目的 CMake 设置”。

确保在对话框的左侧窗格中选中了 Linux 配置(如“Linux 调试” ):

配置窗格的屏幕截图,x64-Debug 和 Linux Debug 都列为选项。

ASan 选项位于“常规”下 。 以“标志=值”格式输入 ASan 运行时标志,并以空格分隔。 UI 错误地建议使用分号。 使用空格或冒号分隔标志。

显示某些地址擦除器运行时标志(例如 detect_leaks=0)的“启用地址擦除器”选项的屏幕截图。

安装 ASan 调试符号

要启用 ASan 诊断,必须在远程 Linux 计算机或 WSL 安装上安装其调试符号 (libasan-dbg)。 加载的 libasan-dbg 版本取决于 Linux 计算机上安装的 GCC 版本:

ASan 版本 GCC 版本
libasan0 gcc-4.8
libasan2 gcc-5
libasan3 gcc-6
libasan4 gcc-7
libasan5 gcc-8

可使用以下命令确定拥有的 GCC 版本:

gcc --version

要查看所需的 libasan-dbg 版本,请运行你的程序,然后查看“输出”窗口的“调试”窗格 。 加载的 ASan 版本对应于 Linux 计算机上所需的 libasan-dbg 版本。 可以使用 Ctrl + F 在窗口中搜索“libasan” 。 例如,如果具有 libasan4,则会看到如下所示的行:

Loaded '/usr/lib/x86_64-linux-gnu/libasan.so.4'. Symbols loaded.

可使用以下命令,在使用 apt 的 Linux 发行版上安装 ASan 调试位。 此命令安装版本 4:

sudo apt-get install libasan4-dbg

有关在 Ubuntu 上安装调试符号包的完整说明,请参阅调试符号包

如果启用了 ASan,Visual Studio 会在“输出”窗口的“调试”窗格顶部提示安装 ASan 调试符号 。