GDB执行错误:argc = <value temporary =“”unavailable,=“”due =“”to =“”optimizations =“”>,argv = 0x7fff5fbff8f8 </value>

时间:2012-03-13 11:10:43

标签: c++ memory gdb

我遇到了使用C ++程序执行的问题。首先,我正在使用MacBook Pro,使用原生g ++进行编译。

我的程序构建了一个Record *数组。每条记录都有一个多维密钥。然后它遍历每条记录以找到它的一维浮动键。

最后,给定两个多维键的间隔,它确定给定的float是否对应于此间隔中的多维键。该算法取自研究论文,实现起来非常简单。

直到计算出100,000个值,没问题,程序才能完成它的工作。但当我转到1,000,000个值时,执行崩溃。这是g ++给出的错误:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00007fff5f08dcd0
0x00000001000021ab in TestPyramid () at include/indextree_test.cc:444

这是gdb给出的完整回溯:

(gdb) backtrace full
#0  0x00000001000021ab in TestPyramid () at include/indextree_test.cc:444
test_records = #1  0x00000001000027be in main (argc=<value temporarily unavailable, due to optimizations>, argv=0x7fff5fbff8f8) at include/indextree_test.cc:83
rc = <value temporarily unavailable, due to optimizations>
progName = 0x7fff5fbff9f8 "/Users/Max/Documents/indextree_test"
testNum = 4

给定行是对函数的调用。

以下是代码示例:

Record* test_records[1000000];
float values[1000000];
int base = 0;

for (int i(0); i < 1000000; i++)
{
    test_records[i] = CreateRecordBasic(i%30+10,i+i%100,"ab","Generic Payload");
    if (i%30+10 > base)
        base = i%30+10;
    if (i+10*i > base)
        base = i+10*i;
    if (i > base)
        base = i;
}

for (int i(0); i < 1000000; i++)
    values[i] = floatValueFromKey(test_records[i]->key, base,num_char);

最后,我将相关的浮动键放在一个列表中。

问题是我电脑的限制吗?我是否以错误的方式分配内存?

感谢您的帮助,

最大

编辑:

以下是CreateRecordBasic的代码:

Record *CreateRecordBasic(int32_t attribute_1, int64_t attribute_2, const char* attribute_3, const char* payload){
    Attribute** a = new Attribute*[3];

    a[0] = ShortAttribute(attribute_1);
    a[1] = IntAttribute(attribute_2);
    a[2] = VarcharAttribute(attribute_3);

    Record *record = new Record;
    record->key.value = a;
    record->key.attribute_count = 3;
    SetValue(record->payload,payload);

    return record;
}

1 个答案:

答案 0 :(得分:0)

Record* test_records[1000000];
float values[1000000];

恕我直言,这些变量太大,无法存储在大小由您的环境定义的堆栈中。 values占用4兆字节而test_records占用4-8兆字节,这是相当大的堆栈空间。编译器并不完全知道系统分配堆栈的大小(这可能会因系统而异),因此您在运行时会收到错误。尝试在堆上分配它们......