2016-11-16 3 views
9

Ich verwende CLion 2016.2.2 und ich möchte eine Methode in der libtins-Bibliothek debuggen. Es sieht jedoch so aus, als ob die Quellen nicht verfügbar sind, da der Debugger beim Versuch, in die Methoden von libtins zu springen, nicht in die aktuelle Ansicht wechselt und nur die aktuelle Ansicht aktualisiert.CLion: Debuggen von externen Bibliotheken durch Hinzufügen von Quelldateien aktivieren

Ich versuchte, dem Vorschlag in this post zu folgen, indem ich include_directories("/home/patrick/libtins/") oder include_directories("/home/patrick/libtins/src/") hinzufüge, während libtins der Stammordner ist, der vom libtins-Speicherorton geklont wird. Aber CLion konnte die mit der libtins-Bibliothek verknüpften Quelldateien immer noch nicht finden.

Meine CMake-Datei sieht wie folgt:

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) 

Was genau muss ich ändern CLION die Quelldateien für das Debuggen zu machen?

Antwort

3

Dies kann passieren, wenn libtins ohne Debug-Informationen erstellt wird. Wie genau bauen Sie es?

Es soll in etwa dem folgenden sein:

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

Der einfachste Weg, dies zu tun, ist libtins direkt in Ihrem Projekt zu erstellen. Seit libtins can also be built with CMake, für Sie der schnellste Weg, dies zu tun, ist ein Verzeichnis libtins Verzeichnis in Ihrer Quelle genannt die libtins enthält source, hinzufügen und es in Ihrem Projekt mit

add_subdirectory(libtins) 

Dazu Sie die erfüllen müssen dependencies von libtins auch.

Dann brauchen Sie nicht mehr FIND_LIBRARY(TINS_LIBRARY tins), da es bereits in Ihrem Projekt vorhanden ist. So verknüpfen es die folgenden sollte es tun:

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

Vergessen Sie nicht, die Dosen Verzeichnisse vorher umfassen:

include_directories(libtins/include/tins) 

Danach, wenn Sie Ihr Programm im Debug-Modus ausführen, sollten die libtins Methoden auch verfügbar sein, da es identisch zu Ihrem Projekt gebaut wurde.

Beachten Sie, dass ich eine andere Strategie wählen würde, wenn Sie libtins in Ihr Projekt langfristig aufnehmen möchten. Dann würde ich lieber mit der ExternalProject_Add command nach einer Lösung suchen.

+3

Ernsthaft? Die UL-zugelassene Lösung für das Debugging in externe Bibliotheken (mit installierten Debug-Informationen) besteht darin, die Bibliothek als Teil Ihres Projekts zu erstellen? Ich würde es kaum so einfach nennen. Ich habe auch dieses Problem mit CLion - ich habe festgestellt, dass, selbst wenn gdb die Bibliotheksquellen finden kann, CLion das immer noch nicht kann. –

+0

@JohnCalcote Wenn Sie die Bibliothek als Teil Ihres Projekts erstellen, stellen Sie sicher, dass Sie dieselben Kompilierungsflags wie die anderen Teile Ihres Projekts haben (hier Debug). Also, ja, CLion wird es finden, und, ja, ich würde das so einfach nennen. Sie können sich nicht darauf verlassen, dass die Debug-Informationen in jedem Fall installiert werden. – oLen

+0

@ JohnCalcote ist 100% richtig. In den meisten Fällen ist es verrückt zu empfehlen, einen externen Build komplett neu zu erstellen. Die meisten Projekte haben extrem komplexe Build-Systeme, was darauf hindeutet, dass Sie es einfach in Ihr eigenes Build-System einfügen, ist nicht realistisch. –

0

Folgendes funktionierte für mich in Ubuntu 16.04.3 LTS mit CLion 2017.3.3.

Zuerst müssen Sie die CLION gdb mit Ubuntus gebündelt ersetzen original (nicht sicher, warum):

$ 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 

dann die Debug-Sitzung starten einen Haltepunkt setzen, bevor sie in der Bibliothekscode zu treten.

Wenn die Ausführung an Ihrem Haltepunkt angehalten wird, wechseln Sie zur Registerkarte GDB-Konsole, und führen Sie diesen Befehl auf den vollständigen Pfad aus, in dem sich der zu debuggende Quellcode befindet.Zum Beispiel, zu debuggen BIO_new Funktion des OpenSSL ich zu tun hatte: ist

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

Da BIO_new in bio_lib.c implementiert, die in den vorherigen Ordner befindet.

Jetzt können Sie Ihren Bibliothekscode eingeben.

Verwandte Themen