Visual Studio 将地址清理程序与MSVC一起使用时,应用程序崩溃

jq6vz3qz  于 2023-02-09  发布在  其他
关注(0)|答案(3)|浏览(411)

我正在尝试使用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。丢失的库很可能是地址清理程序本身。
如何正确配置我的系统来解决这个问题?谢谢!

mspsb9vt

mspsb9vt1#

ASAN仍然是MSVC中的一个实验特性。因此,clang_rt.asan_*.dll DLL没有作为VC++可再发行包的一部分安装在System32中。
如此处所述,在共享CRT模式(/MDd)下使用ASAN时,您需要确保clang_rt.asan_dbg_dynamic-x86_64.dllclang_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 ..

xfyts7mz

xfyts7mz2#

您可能还需要从同一文件夹中携带llvm-symbolizer.exe。Sanitizer运行时将使用它来符号化堆栈跟踪,以防发现错误

nkkqxpd9

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位版本。

相关问题