CLion:通过添加源文件启用外部库的调试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CLion:通过添加源文件启用外部库的调试相关的知识,希望对你有一定的参考价值。

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

我尝试通过添加this postinclude_directories("/home/patrick/libtins/")来跟随include_directories("/home/patrick/libtins/src/")中的建议,其中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成为可用于调试的源文件?

答案

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

它应该大致如下:

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug ../
make
另一答案

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

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方法也应该可用,因为它的构建方式与您的项目完全相同。

请注意,如果您希望长期在项目中包含libtins,我会选择其他策略。然后,我宁愿寻找ExternalProject_Add command的解决方案。

另一答案

以下是在Ubuntu 16.04.3 LTS和CLion 2017.3.3中为我工作的。

首先,您必须用Ubuntu的原始版本替换CLion捆绑的gdb(不确定原因):

$ 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中实现的,它位于上一个文件夹中。

现在您可以进入库代码。

以上是关于CLion:通过添加源文件启用外部库的调试的主要内容,如果未能解决你的问题,请参考以下文章

可以在运行/调试配置中使用 CLion 宏吗?

使用 CLion 调试节点插件

如何在intellij idea中启用从源到外部库的滚动?

Visual Studio Code - Python 调试 - 执行时步入外部函数的代码

通过 Grab 添加的外部库的可选依赖项不可用

使用 CLion 调试 redis