当我尝试调试在Linux机器上编写的C程序时(现在,我正在使用Visual C ++ Express),我首先得到堆栈溢出错误。所以当我点击继续时,我收到了另一条错误消息,
访问冲突读取位置0x00030000
所以我决定一步一步地调试。因此,当我尝试它时,它会向我显示错误
当前位置没有可用的源代码。
出现此错误的原因是什么?
守则
#if 1
while(1)
#endif
{
fillList();
#if 1
{
op_ds_bulk(ops, &total, 1);
temp = res("Bulk Write:", total, fp);
index = 0;
}
#endif
void op_ds_bulk(u_int ops, u_int * totalp, int update)
{
char encode_db[] = "encode";
if(update)
{
database_insert_bluk(list, ops);
database_sync();
*totalp = ops;
}
else
{
CHUNK prefetch[4096];
int random = rand() % (h-ops+1);
__os_clock(NULL, &start_time.secs, &start_time.usecs);
database_select_end(65546, random, prefetch, ops);
__os_clock(NULL, &end_time.secs, &end_time.usecs);
*totalp = ops;
}
}
}
答案 0 :(得分:1)
无效访问可能发生在标准库代码中的某处。 Express版本中没有此源。
您可以检查调用堆栈以查找调用库函数的代码部分,并从那里开始工作。
答案 1 :(得分:0)
前段时间我遇到过类似的问题,也许这与你的问题有关?
我在堆栈上有一个数组(你也有一个 - prefetch
)并且我意外地将它清除得太远(超出数组范围),删除数组之外的任何信息。
当您调用函数时,返回地址也存储在堆栈中(计算机必须知道从函数返回的位置)。由于我已经清除了,程序跳转到地址0x0和SegFault-ed之下。在调试时,我还收到一条消息“当前位置没有源代码”,因为“当前位置”是0x0,当然那里没有代码。
所以我怀疑你在堆栈上的某个阵列上越界了。
通过查看您的代码,我发现了两件可疑的事情:
预取数组的大小是4096,但是你用参数65546调用database_select_end
。也许它没问题(不知道那个函数是做什么的)但是可能不是;)
65546不是2的幂.2 ^ 16 = 65536
答案 2 :(得分:0)
我通过使用不同的函数名编写相同的代码来解决问题。这对我来说太奇怪了,因为它解决了我的问题。我不知道为什么。