提问者:小点点

使用MSVC地址清理时崩溃


我正在尝试使用地址消毒剂与MSVC。

Visual Studio安装程序说我有“Visual Studio Community 2019”16.9.0版。

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

int main() {
    return 0;
}

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)

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

LINK:warning LNK4302:请将“/debug”添加到LINK命令行,以便更好地报告错误

到目前为止,这么好(?)。

但是,当我运行应用程序时,返回代码是-1073741515(0xC0000135)。谷歌告诉我,这很可能是一个丢失的库。

如果从构建中删除add_definition(/fsanitize=address/zi),则返回值为0。丢失的库很可能是地址消毒器本身。

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


共1个答案

匿名用户

ASAN仍然是MSVC中的一个实验性特性。因此,clang_rt.asan_*.dllDLL没有作为VC++可再发行包的一部分安装在System32中。

正如这里所解释的,在共享CRT模式(/mdd)中使用ASAN时,您需要确保clang_rt.asan_dbg_dynamic-x86_64.dllclang_rt.asan_dynamic-x86_64.dll在路径上。

您可以将C:\Program Files(x86)\Microsoft Visual Studio\2019\Community\vc\tools\msvc\14.28.29910\lib\x64添加到路径中,也可以将DLL复制到项目的输出文件夹(与.exe并列)。

或者,您可以构建静态CRT模式(例如/mtd),然后ASAN库也将嵌入到.exe中。

最后,如警告所示,请使用带有调试生成类型的ASAN,以获得更好的复盖率:
cmake-dcmake_build_type=Debug..