【发布时间】:2020-11-13 13:00:00
【问题描述】:
我正在使用 CLion IDE、带有 GCC 编译器的 Cmake,并且我正在尝试使用地址清理程序运行二进制文件。我跟着这个:What's the proper way to enable AddressSanitizer in CMake that works in Xcode 并添加了
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
到 CMakeLists.txt 文件,然后使用运行按钮在 CLion 中运行二进制文件时出错:
==22084==ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD.
当我通过终端运行二进制文件时,它可以正常工作。它在 CLion 的运行窗口中不起作用。 https://imgur.com/a/MXOM7BJ
编辑:解决方案是将LD_PRELOAD=libasan.so.5 添加到 CLion 的环境变量中。
我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.17)
project(Playground)
set(CMAKE_CXX_STANDARD 14)
add_executable(Playground main.cpp)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -g")
发生了什么事?
将这些行从 stackoverflow 线程添加到 CMakeLists.txt 文件也不起作用。
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fsanitize=address -fno-omit-frame-pointer")
本指南中的这一行 https://www.jetbrains.com/help/clion/google-sanitizers.html#LSanChapter 也不起作用
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -O1")
然后我尝试将LD_TRACE_LOADED_OBJECTS=1 添加到 CLion 环境变量中,但没有任何改变。
我的ldd ./file二进制命令输出:
linux-vdso.so.1 (0x00007ffd82d96000)
libgtk3-nocsd.so.0 => /lib/x86_64-linux-gnu/libgtk3-nocsd.so.0 (0x00007f7d532e1000)
libasan.so.5 => /lib/x86_64-linux-gnu/libasan.so.5 (0x00007f7d528af000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7d526bd000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7d526b7000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7d52694000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f7d52689000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7d52538000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7d5251d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7d5350c000)
【问题讨论】:
-
请告诉我们您的
CMakeLists.txt。您是否尝试过按照错误消息告诉您的操作(“您应该将运行时链接到您的应用程序或使用 LD_PRELOAD 手动预加载它”)? -
由于显然 CLion 看到了不同的加载顺序,您能否将
LD_TRACE_LOADED_OBJECTS=1添加到运行配置的环境变量中并与终端中的常规ldd运行进行比较? -
你用的是什么编译器?
-
@Someprogrammerdude 已编辑到我的帖子
-
以 LD_TRACE_LOADED_OBJECTS=1 运行应该会产生类似的输出列表。请注意 libgtk3-nocsd.so.0 是如何出现在 libasan.so.5 之前的,因此 ASan(正确地)抱怨它无法跟踪它之前的库管理的所有内存。
标签: c++ cmake clion address-sanitizer