好的,这可能听起来像是一个愚蠢的问题,但我却卡住了:在lldb调试会话期间,我无法读取一个变量的值(使用gdb时一切正常)。
我找到了其他人遇到过与我相同的错误信息的帖子,但不同之处在于,我甚至无法弄清如何打印出最简单形式的变量的值。
为了更好地表达我的问题,我将在这里考虑一个非常简单的例子。我们有一个文件"main.c",内容如下:
我使用以下方式进行编译:
生成了一个名为"a.out"的二进制文件。
然后我调用了lldb:
然后我运行代码:
当然:
我不确定@Sean Perry所说的“使用指针”是否是这个意思,但我认为无论如何它都会防止代码优化,因为变量c的地址在每次运行二进制文件时(或多或少地)随机更改。
3:最终,我发现了一些有趣的事情:
我找到了其他人遇到过与我相同的错误信息的帖子,但不同之处在于,我甚至无法弄清如何打印出最简单形式的变量的值。
为了更好地表达我的问题,我将在这里考虑一个非常简单的例子。我们有一个文件"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"的二进制文件。
然后我调用了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"(软件包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进行调试:可以工作
Ubuntu 4.8.2-19ubuntu1
和Ubuntu/Linaro 4.7.3-12ubuntu1
上编译它,并尝试使用lldb-3.4(稳定分支)进行调试,结果成功了(即(lldb) print c
导致(int) $0 = 3
)。 - Scisclang-3.4
?尝试再次运行apt-get install clang-3.4 lldb-3.4
,也许存在某些版本不匹配的问题 - 当然这只是一种猜测,但这确实是一种奇怪的行为)。 - Scisclang-3.2.*
版本的clang
。我还安装了libllvm-3.3
和libllvm-3.3:i386
,以及libllvm-3.4
(似乎3.3版本的库是其他软件的依赖项,包括x.org
)。然而,仅安装clang-3.4
和lldb-3.4
似乎没有任何区别。再次强调,clang
+lldb
组合运行良好,而gcc
+lldb
组合失败。当我第一次发布我的问题时,我认为我无法正确使用lldb,但随着时间的推移,我越来越感觉问题来自于我特定的gcc
版本中的故障... - Gael Lorieul-O0 -g -DDEBUG=2
。 - MrE