CLion:通过添加源文件启用外部库的调试
CLion: Enable debugging of external libraries by adding source files
我正在使用 CLion 2016.2.2,我想调试 libtins 库中的一个方法。但是,源代码似乎不可用,因为当尝试从 libtins 跳转到方法时,调试器不会进入,只会更新当前视图。
我尝试按照 this post 中的建议添加 include_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, the fastest way for you to do this is to add a directory called libtins
in your source directory containing the libtins source 起,将其包含在您的项目中
add_subdirectory(libtins)
为此,您还需要完成 dependencies libtins。
然后,您不再需要 FIND_LIBRARY(TINS_LIBRARY tins)
,因为它已经存在于您的项目中。要 link 它应该执行以下操作:
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 的原始版本替换 gdb
捆绑的 CLion(不知道为什么):
$ 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 2016.2.2,我想调试 libtins 库中的一个方法。但是,源代码似乎不可用,因为当尝试从 libtins 跳转到方法时,调试器不会进入,只会更新当前视图。
我尝试按照 this post 中的建议添加 include_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, the fastest way for you to do this is to add a directory called libtins
in your source directory containing the libtins source 起,将其包含在您的项目中
add_subdirectory(libtins)
为此,您还需要完成 dependencies libtins。
然后,您不再需要 FIND_LIBRARY(TINS_LIBRARY tins)
,因为它已经存在于您的项目中。要 link 它应该执行以下操作:
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 的原始版本替换 gdb
捆绑的 CLion(不知道为什么):
$ 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
中实现的。
现在您可以进入您的库代码。