【问题标题】:Cannot get lldb location to resolve无法获取 lldb 位置来解决
【发布时间】:2016-09-15 11:11:36
【问题描述】:

我正在尝试使用 cmake 和 lldb 从命令行编译和调试。我不确定为什么这不起作用:

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)

然后:

~/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)

我认为-g 选项对于将调试位置添加到可执行文件以与 lldb 一起使用是必要的,但我已经尝试了数小时的各种调整,但无法解决任何问题。我错过了什么?

【问题讨论】:

  • 编译可执行文件时显示make VERBOSE=1的编译选项是什么? CMAKE_CXX_FLAGS 添加新标志,但不删除特定于配置的选项。
  • @Tsyvarev 我发现我需要引用 cmake 文件中的路径,但只有当我从 lldb 断点中删除 src/ 时,它才会找到它。这对我来说似乎很奇怪。我想如果我有两个同名的源,那么它要么需要目录,要么会在两个文件中设置相同的断点。我得试验一下。但除此之外,路径不是文件名的一部分,应该省略
  • 无论如何,了解编译行会有很大帮助。 CMake 有可能将源文件复制到构建树下的某个目录中,然后在那里构建它。这样它会丢失路径前缀。另一种可能性,它使用源文件的绝对路径来编译它。

标签: cmake lldb


【解决方案1】:

lldb 中有一个错误,这意味着您要么必须使用仅文件名设置断点,要么必须使用调试信息中记录的完整路径。部分路径应该可以工作,但目前还不行。

如果您的构建系统可以移动文件或通过符号链接引用它们,那么使用完整路径会很棘手。然后你必须得到编译器拼写的路径。您可以通过以下方式找到:

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

然后获取断点所在的地址,然后执行:

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

此输出的 CompileUnit 部分中的文件将是调试信息中拼写的路径。

【讨论】:

  • 经过数小时的调试,我终于找到了这个!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多