【问题标题】:CLion: Enable debugging of external libraries by adding source filesCLion:通过添加源文件启用外部库的调试
【发布时间】:2017-03-30 01:37:32
【问题描述】:

我正在使用 CLion 2016.2.2,我想调试 libtins 库中的一个方法。但是,看起来源不可用,因为当尝试从 libtins 跳转到方法时,调试器不会进入并仅更新当前视图。

我尝试通过添加include_directories("/home/patrick/libtins/")include_directories("/home/patrick/libtins/src/")来遵循this post 中的建议,而libtins 是从libtins 存储库克隆的根文件夹。但是 CLion 仍然找不到与 libtins 库关联的源文件。

我的 CMake 文件如下所示:

project(myproject)

# Define CMake settings
cmake_minimum_required(VERSION 3.2)

IF(NOT CMAKE_BUILD_TYPE)
   SET(CMAKE_BUILD_TYPE "Release")
ENDIF()

IF (CMAKE_BUILD_TYPE MATCHES Debug)
    MESSAGE(STATUS "Running Debug configuration.")
ELSEIF (CMAKE_BUILD_TYPE MATCHES Release)
    MESSAGE(STATUS "Running Release configuration.")
ENDIF()

SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)

# Add the library source files
SET(SOURCE_FILES cxx/myclass.cpp cxx/myclass.h)

# Include SQLiteCpp library and build it
option(SQLITECPP_RUN_CPPLINT OFF)
include_directories(SQLiteCpp/include)
add_subdirectory(SQLiteCpp)

# Find libtins library
FIND_LIBRARY(TINS_LIBRARY tins)
IF(TINS_LIBRARY)
  MESSAGE(STATUS "Tins library found in ${TINS_LIBRARY}")
ELSE()
  MESSAGE(FATAL_ERROR "Tins library not found.")
ENDIF()

FIND_PACKAGE(PythonLibs 3.0 REQUIRED)
IF(PYTHONLIBS_FOUND)
  INCLUDE_DIRECTORIES("${PYTHON_INCLUDE_DIRS}")
ELSE()
  MESSAGE(FATAL_ERROR "Unable to find Python libraries.")
ENDIF()

# Find and configure BOOST library
FIND_PACKAGE(Boost 1.54 QUIET)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}")
    SET(Boost_USE_STATIC_LIBS OFF)
    SET(Boost_USE_MULTITHREADED ON)
    SET(Boost_USE_STATIC_RUNTIME OFF)
    # Find the boost python 3 component
    SET(PYTHON_VERSIONS python3 python-py35 python-py34 python-py33 python-py32)
    FOREACH(VERSION ${PYTHON_VERSIONS})
      FIND_PACKAGE(Boost COMPONENTS ${VERSION} QUIET)
      IF(Boost_FOUND)
        MESSAGE(STATUS "Python Boost found as '${VERSION}'.")
        BREAK()
      ENDIF()
    ENDFOREACH(VERSION)
    IF(NOT Boost_FOUND)
      MESSAGE(FATAL_ERROR "Python Boost component not found.")
    ENDIF()
ELSE ()
    MESSAGE(FATAL_ERROR "Unable to find the Boost libraries (version 1.54 or higher).")
ENDIF ()

SET_target_properties(sqlite3 PROPERTIES POSITION_INDEPENDENT_CODE ON)

ADD_EXECUTABLE(myproject ${SOURCE_FILES} "/home/pjattke/libtins/")
TARGET_LINK_LIBRARIES(myproject ${Boost_LIBRARIES} "${TINS_LIBRARY}" SQLiteCpp sqlite3 pthread dl)

为了使 CLion 源文件可用于调试,我究竟必须更改什么?

【问题讨论】:

    标签: c++ debugging cmake clion libtins


    【解决方案1】:

    如果 libtins 是在没有调试信息的情况下构建的,则可能会发生这种情况。你究竟是如何构建它的?

    大致应该是这样的:

    mkdir build
    cd build
    cmake -DCMAKE_BUILD_TYPE=Debug ../
    make
    

    【讨论】:

      【解决方案2】:

      以下内容在带有 CLion 2017.3.3 的 Ubuntu 16.04.3 LTS 中为我​​工作。

      首先,您必须将捆绑的 CLion gdb 替换为 Ubuntu 的原始版本(不知道为什么):

      $ cd ~/.local/share/JetBrains/Toolbox/apps/CLion/ch-0/173.4548.31/bin/gdb/bin
      $ mv gdb gdb_original
      $ ln -s /usr/bin/gdb gdb
      

      然后开始调试会话,在进入库代码之前放置一个断点。

      当执行在断点处停止时,转到 GDB 控制台选项卡并执行此命令,指向要调试的源代码所在的完整路径。例如,要调试 OpenSSL 的 BIO_new 函数,我必须这样做:

      (gdb) dir /full/path/to/openssl-1.0.2g/crypto/bio
      

      因为BIO_new 是在位于上一个文件夹中的bio_lib.c 中实现的。

      现在你可以进入你的库代码了。

      【讨论】:

      • 非常有帮助。我不需要换出捆绑的 gdb,但能够让 Clion 开始使用库中的源代码。在此过程中,我可以在进入反汇编部分后添加源路径……然后在下一步转到源代码。谢谢!
      【解决方案3】:

      最简单的方法是直接在您的项目中构建 libtin。 从libtins can also be built with CMake开始,最快的方法是在包含libtins source的源目录中添加一个名为libtins的目录,并将其包含在您的项目中

      add_subdirectory(libtins)
      

      为此,您还需要满足 libtins 的 dependencies

      然后,您不再需要FIND_LIBRARY(TINS_LIBRARY tins),因为它已经存在于您的项目中。要链接它,以下应该可以解决问题:

      TARGET_LINK_LIBRARIES(myproject ${Boost_LIBRARIES} tins SQLiteCpp sqlite3 pthread dl)
      

      不要忘记事先包含 tins 目录:

      include_directories(libtins/include/tins)
      

      在此之后,当您在调试模式下运行程序时,libtins 方法也应该可用,因为它是与您的项目相同构建的。

      请注意,如果您希望长期在项目中包含 libtin,我会选择另一种策略。那么,我宁愿用ExternalProject_Add command寻找解决方案。

      【讨论】:

      • 认真的吗? UL 批准的调试外部库(已安装调试信息)的解决方案是将库构建为项目的一部分?我很难说这很容易。我的 CLion 也有这个问题 - 我发现即使 gdb 可以找到库源,CLion 仍然不能。
      • @JohnCalcote 将库构建为项目的一部分可确保您具有与项目其他部分相同的编译标志(此处为调试)。所以,是的,CLion 会找到它,而且,是的,我认为这很容易。在任何情况下都不能依赖 debug-info 来安装。
      • @JohnCalcote 100% 正确。在大多数情况下,建议完全重做外部构建是很疯狂的。大多数项目都有极其复杂的构建系统,建议您随便将其放入自己的构建系统中是不现实的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      相关资源
      最近更新 更多