将地址清理程序与 MSVC 结合使用时应用程序崩溃

Bkt*_*ero 14 c++ visual-studio

我正在尝试将地址清理程序与 MSVC 一起使用。

Visual Studio 安装程序显示我有“Visual Studio Community 2019”版本 16.9.0。

我有最基本的C++程序:

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt 也非常基本:

cmake_minimum_required(VERSION 3.14)
project(untitled VERSION 1.0.0)
add_executable(${PROJECT_NAME} main.cpp)
add_definitions(/fsanitize=address /Zi)
Run Code Online (Sandbox Code Playgroud)

程序在调试和发布模式下都能正确编译和链接。在发布模式下,我收到以下警告,这似乎完全合法:

LINK:警告 LNK4302:请将“/DEBUG”添加到链接命令行以获得更好的 ASAN 错误报告

到目前为止,一切都很好 (?)。

但是,当我运行该应用程序时,返回代码为-1073741515 (0xC0000135)。谷歌告诉我这可能表明缺少一个库。

如果我add_definitions(/fsanitize=address /Zi)从构建中删除,返回值为 0。丢失的库很可能是地址清理程序本身。

如何正确配置我的系统来解决此问题?谢谢!

rus*_*tyx 22

ASAN 是一种调试功能。因此,clang_rt.asan_*.dllDLL 不会作为 VC++ 可再发行软件包的一部分安装在 System32 中。

如此处所述,在共享 CRT 模式 ( /MDd) 下使用 ASAN 时,您需要确保clang_rt.asan_dbg_dynamic-x86_64.dllclang_rt.asan_dynamic-x86_64.dll位于 PATH 上。

您可以将C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\bin\Hostx64\x64DLL 添加到 PATH 或将其复制到项目的输出文件夹(与 .exe 并排)。

在 Visual Studio 2022 版本 17.7 Preview 3 之前,您可以选择以静态 CRT 模式(例如/MTd)进行构建,这会将 ASAN 库嵌入到 .exe 中。较新版本的 Visual Studio始终需要单独的 DLL

最后,正如警告所建议的,将 ASAN 与 Debug 构建类型一起使用以获得更好的覆盖范围:
cmake -DCMAKE_BUILD_TYPE=Debug ..


k_o*_*_o_ 7

在 Visual Studio 22 中,dll 的位置已更改。就我而言,我需要 i386 版本。的位置clang_rt.asan_dbg_dynamic-i386.dll是:

  • 社区 x86: C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\<version>\bin\Hostx86\x86.
  • 专业x64:C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\<version>\bin\Hostx64\x64\

必须将其添加到 PATH 变量(或复制到 exe 目录)以防止出现此错误。如果针对 x64 进行调试,请采用 64 位版本。

  • 可以使用变量“$(VCToolsInstallDir)”作为直至并包含“&lt;version&gt;”的路径。如果它在 MSVS 中不可用,则将 `$(VCTargetsPath)/Microsoft.Cpp.Common.props` 添加到项目中。 (3认同)