2016-05-18 12 views
0

Ich versuche zu kompilieren und debuggen von der Befehlszeile mit cmake und lldb. Ich bin mir nicht sicher, warum dies nicht funktioniert:Kann nicht lldb Speicherort zum Auflösen

cmake_minimum_required (VERSION 2.6) 
project (etest) 
include_directories(src) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -g") 
add_executable(etest src/m.cpp) 
set_property(TARGET etest PROPERTY CXX_STANDARD 14) 
set_property(TARGET etest PROPERTY CXX_STANDARD_REQUIRED ON) 

Dann:

~/Desktop/em2 cmake . 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /Users/jbake/Desktop/em2 
~/Desktop/em2 make 
[ 50%] Building CXX object CMakeFiles/etest.dir/src/m.cpp.o 
[100%] Linking CXX executable etest 
[100%] Built target etest 
~/Desktop/em2 lldb etest 
(lldb) target create "etest" 
Current executable set to 'etest' (x86_64). 
(lldb) b src/m.cpp:7 
Breakpoint 1: no locations (pending). 
WARNING: Unable to resolve breakpoint to any actual locations. 
(lldb) breakpoint list 
Current breakpoints: 
1: file = 'src/m.cpp', line = 7, locations = 0 (pending) 

Ich dachte, die -g Option war notwendig Debug-Standorte an die ausführbare Datei mit LLDB zur Verwendung hinzugefügt zu bekommen, aber ich habe schon seit Stunden verschiedene Optimierungen probiert und kann nichts lösen. Was vermisse ich?

+0

Welche Kompilieroptionen zeigen 'make VERBOSE = 1', wenn die Kompilierung ausführbar ist? 'CMAKE_CXX_FLAGS' fügt neue Flags hinzu, entfernt jedoch keine konfigurationsspezifischen Optionen. – Tsyvarev

+0

@Tsyvarev was ich entdeckt habe, ist, dass ich den Pfad in der cmake-Datei referenzieren muss, aber nur wenn ich den 'src /' aus dem lldb-Haltepunkt entferne, dann findet er es. das erscheint mir seltsam. Ich vermute, wenn ich zwei Quellen mit dem gleichen Namen hätte, dann würde entweder das Verzeichnis benötigt werden oder es würde den gleichen Haltepunkt in beiden Dateien setzen. Ich muss experimentieren. aber ansonsten ist der Pfad kein Teil des Dateinamens und sollte weggelassen werden. – johnbakers

+0

In jedem Fall würde die Kenntnis der Kompilierungszeile sehr hilfreich sein. Es ist möglich, dass CMake die Quelldatei in ein Verzeichnis unter build tree kopiert und dann dort erstellt. Auf diese Weise verliert es Pfadpräfixe. Eine andere Möglichkeit, dass es den absoluten Pfad zur Quelldatei verwendet, um es zu kompilieren. – Tsyvarev

Antwort

0

Es gibt einen Fehler in lldb, das bedeutet, dass Sie entweder einen Haltepunkt mit JUST des Dateinamens festlegen müssen, oder Sie müssen den vollständigen Pfad verwenden, wie in den Debuginformationen aufgezeichnet. Teilpfade sollten funktionieren, aber derzeit nicht.

Die Verwendung vollständiger Pfade ist schwierig, wenn Sie über ein Buildsystem verfügen, das Dateien durch symbolische Links verschiebt oder auf sie verweist. Dann muss der Pfad zum Compiler geschrieben werden. Sie können diese finden, indem Sie:

(lldb) break set -f JustTheName.cpp -l 10 

Dann die Adresse ergreifen, die der Breakpoint auf gesetzt wurde, und zu tun:

(lldb) image lookup -v -a <BREAK_ADDRESS> 

Die Datei wird im CompileUnit Teil dieser Ausgabe der Weg sein wird, wie Dinkel in den Debuginformationen.

Verwandte Themen