我正在尝试使用MSVC地址消毒。
Visual Studio安装程序说我有“Visual Studio社区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)
程序在调试和发布模式下都能正确编译和链接。在发布模式下,我有下面的警告,看起来完全合法:
链接:警告LNK 4302:请将'/DEBUG'添加到link命令行以获得更好的ASAN错误报告
到目前为止,一切顺利(?)。
但是,当我运行应用程序时,返回代码是-1073741515(0xC 0000135),Google告诉我这可能表示缺少一个库。
如果我从构建中删除add_definitions(/fsanitize=address /Zi)
,返回值为0。丢失的库很可能是地址清理程序本身。
如何正确配置我的系统来解决这个问题?谢谢!
3条答案
按热度按时间mspsb9vt1#
ASAN仍然是MSVC中的一个实验特性。因此,
clang_rt.asan_*.dll
DLL没有作为VC++可再发行包的一部分安装在System32中。如此处所述,在共享CRT模式(
/MDd
)下使用ASAN时,您需要确保clang_rt.asan_dbg_dynamic-x86_64.dll
和clang_rt.asan_dynamic-x86_64.dll
位于PATH上。您可以将
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\lib\x64
添加到PATH中,也可以将DLL复制到项目的输出文件夹中(与.exe并排)。或者,您可以在静态CRT模式下构建(例如
/MTd
),然后ASAN库也将嵌入到. exe中。最后,正如警告所建议的,使用带有Debug构建类型的ASAN以获得更好的覆盖率:
cmake -DCMAKE_BUILD_TYPE=Debug ..
xfyts7mz2#
您可能还需要从同一文件夹中携带llvm-symbolizer.exe。Sanitizer运行时将使用它来符号化堆栈跟踪,以防发现错误
nkkqxpd93#
在Visual Studio 22中,dll的位置已更改。在我的情况下,我需要i386版本。
clang_rt.asan_dbg_dynamic-i386.dll
的位置为C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.31.31103\bin\Hostx86\x86
。必须将此位置添加到PATH变量以防止此错误。如果针对x64进行调试,请使用64位版本。