【问题标题】:CLion wont run binary with address sanitizerCLion 不会使用地址清理程序运行二进制文件
【发布时间】: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


【解决方案1】:

问题是由您环境中某处的LD_PRELOAD=libgtk3-nocsd.so.0 设置引起的。覆盖它或取消设置 CLion 运行配置中的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 2022-07-19
    • 2012-08-06
    • 2019-03-24
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多