我正在尝试使用GDB调试以下C程序:
// Program to generate a user specified number of
// fibonacci numbers using variable length arrays
// Chapter 7 Program 8 2013-07-14
#include <stdio.h>
int main(void)
{
int i, numFibs;
printf("How many fibonacci numbers do you want (between 1 and 75)?\n");
scanf("%i", &numFibs);
if (numFibs < 1 || numFibs > 75)
{
printf("Between 1 and 75 remember?\n");
return 1;
}
unsigned long long int fibonacci[numFibs];
fibonacci[0] = 0; // by definition
fibonacci[1] = 1; // by definition
for(i = 2; i < numFibs; i++)
fibonacci[i] = fibonacci[i-2] + fibonacci[i-1];
for(i = 0; i < numFibs; i++)
printf("%llu ", fibonacci[i]);
printf("\n");
return 0;
}
我遇到的问题是在尝试使用以下代码编译代码时:
clang -ggdb3 -O0 -Wall -Werror 7_8_FibonacciVarLengthArrays.c
当我尝试在创建的a.out文件上运行gdb时,我正在逐步执行程序。在fibonacci []数组被decalared之后的任何时候我输入:
信息本地人
结果显示fibonacci <value optimized out>
(直到我的for循环的第一次迭代之后),然后导致fibonacci为程序的其余部分保存地址0xbffff128(但解除引用该地址似乎不包含任何有意义的数据)。 / p>
我很困惑为什么当使用-O0标志时clang似乎正在优化这个数组?
我可以使用gcc编译此代码,使用GDB时,值会按预期显示.... 有什么想法吗?
谢谢。
答案 0 :(得分:3)
您没有提到您使用的是哪个版本的clang。我用3.2和最近的SVN安装(3.4)尝试了它。
这两个版本生成的代码与我非常相似,但调试信息不同。当我尝试检查gdb中的fibonacci时,clang 3.2(来自默认的ubuntu 13.04安装)会产生错误:
fibonacci = <error reading variable fibonacci (DWARF-2 expression error: DW_OP_reg operations must be used either alone or in conjunction with DW_OP_piece or DW_OP_bit_piece.)>
在用clang 3.4编译的代码中,一切正常。在这两种情况下,阵列都“优化了”;它清楚地分配在堆栈上。
所以我怀疑你所看到的奇怪与调试信息的发送有关,而不是与实际的代码有关。
答案 1 :(得分:3)
gdb尚不支持调试堆栈分配的可变长度数组。见https://sourceware.org/gdb/wiki/VariableLengthArray
使用编译时常量或malloc来分配fibonacci,以便gdb可以看到它。
另见GDB reports "no symbol in current context" upon array initialization
答案 2 :(得分:1)
clang根本不是“优化”阵列!该数组在堆栈上声明为可变长度数组,因此在达到其声明时必须显式分配(使用类似于alloca()
使用的技术)。在该过程完成之前,数组的起始地址是未知的。