【发布时间】:2014-08-06 12:53:36
【问题描述】:
好的,所以这听起来像是一个愚蠢的问题,但我被困住了:我在 lldb 调试会话期间无法读取变量的值(gdb 工作正常)。
我找到了其他人的帖子,他们遇到了与我相同的错误消息,但不同的是,我什至不知道如何打印出最简单形式的变量的值。
为了更好地表达我的问题,我将在这里考虑一个非常简单的示例。我们有一个包含以下代码的文件“main.c”:
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int a = 1;
int b = 2;
int c = 0;
c = a + b;
c = c*b;
printf("c = %d\n", c);
return 0;
}
我使用它编译它:
user@machine ~ $ gcc -g main.c
一个名为的二进制文件 “a.out” 生成
然后我 ivoque lldb :
user@machine ~ $ lldb-3.4 ./a.out
我想在第 9 行停下来读取 c 的值。因此,我首先添加一个断点:
(lldb) breakpoint set -f main.c -l 9
然后我运行代码:
(lldb) run
到目前为止,一切都按预期进行。现在是棘手的部分:我想读取变量 c 的值。因此,我写:
(lldb) print c
然后 lldb 返回我:
error: use of undeclared identifier 'c'
error: 1 errors parsing expression
当然:
(lldb) expression c
返回完全相同的错误信息。
有什么我错过的吗?任何帮助将不胜感激。
我的设置:
- lldb:“lldb 版本 3.4(修订版)”(包 v.:“3.4~svn183914-1ubuntu1”)
- gcc : "gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1" (package v. : "4.8.1-2ubuntu3")
- (我的仓库是linux mint 16默认提供的)
@Sean Perry 的回答提供了更多信息:
1:附加选项 -O0 似乎不会改变调试器的行为。
2:我也尝试使用以下虚拟代码代替我之前的代码
#include <stdlib.h>
#include <stdio.h>
int main(void) {
long a = 1;
long b = 2;
long c = 0;
c = a + b;
c += (long) &c;
printf("c = %ld\n", c);
return 0;
}
我不确定@Sean Perry 所说的“使用指针”是什么意思,但我认为它必须阻止代码优化,因为每次运行二进制文件时变量 c 的地址(或多或少)都会随机更改。
3:最后,我注意到了一些有趣的事情:
- 使用 gcc [-g -O0] 编译,然后使用 gdb 进行调试:可行
- 使用 gcc [-g -O0] 编译然后使用 lldb 调试:不起作用
- 使用 clang [-g -O0] 编译然后使用 gdb 调试:工作
- 使用 clang [-g -O0] 编译然后使用 lldb 调试:工作
edit1:回复@SeanPerry edit2 : 区分软件版本和软件包版本
【问题讨论】:
-
我已经尝试复制粘贴您的确切代码并使用
Ubuntu 4.8.2-19ubuntu1和Ubuntu/Linaro 4.7.3-12ubuntu1编译它,并尝试使用lldb-3.4 (stable branch) 对其进行调试,它可以正常工作(即@987654334 @导致(int) $0 = 3) -
@Scis:尴尬……你是在 32 位还是 64 位机器上? (只是想知道我正在使用的 64-b 版本的 gcc 是否存在故障)。我的 gcc 版本是 Ubuntu/Linaro 4.8.1-10ubuntu9,我的 lldb 版本是“lldb version 3.4 (revision)”。我对这是一个稳定版本还是不稳定版本有点困惑......一方面,我的仓库中的 lldb 包被标记为“svn”,另一方面我安装它并输入“aptitude install lldb-3.4” ,这正是您建议我阅读的页面 [链接] (llvm.org/apt) 上给出的说明。你知道我怎么能找到这个吗?
-
我使用的是 64 位 ubuntu 14.04 LTS。至于安装,似乎我们俩都以相同的方式安装了它(顺便说一下,您是否也按照建议安装了
clang-3.4?尝试再次运行apt-get install clang-3.4 lldb-3.4,也许有一些版本不匹配——这当然只是一种猜测,但又一次这是一种奇怪的行为) -
我好像安装了
clang-3.2.*版本的clang。我还安装了libllvm-3.3和libllvm-3.3:i386以及libllvm-3.4(lib 的3.3 版本是其他软件的依赖项,包括x.org似乎)。但是,仅安装clang-3.4和lldb-3.4似乎没有任何区别。再一次,clang+lldb组合工作正常,这是gcc+lldb组合失败。当我第一次发布我的问题时,我认为我无法正确使用 lldb,但越是这样,我就越觉得这个问题来自我特定的gcc版本中的一个小故障。 ... -
@Scis 实际上,问题来自我的特定版本的 gcc (4.8.1)。使用 gcc 4.7.3 可以正常工作。我认为这一定是在我的 r 之间纠正的小故障。 4.8.1 和 r。 4.8.2 你有……这么少……(^.^')谢谢你的帮助!