错误 - 当前位置没有可用的源代码

时间:2011-03-03 06:17:14

标签: c++ c visual-c++ berkeley-db

当我尝试调试在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;
            }
        }
    }

3 个答案:

答案 0 :(得分:1)

无效访问可能发生在标准库代码中的某处。 Express版本中没有此源。

您可以检查调用堆栈以查找调用库函数的代码部分,并从那里开始工作。

答案 1 :(得分:0)

前段时间我遇到过类似的问题,也许这与你的问题有关?

我在堆栈上有一个数组(你也有一个 - prefetch)并且我意外地将它清除得太远(超出数组范围),删除数组之外的任何信息。

当您调用函数时,返回地址也存储在堆栈中(计算机必须知道从函数返回的位置)。由于我已经清除了,程序跳转到地址0x0和SegFault-ed之下。在调试时,我还收到一条消息“当前位置没有源代码”,因为“当前位置”是0x0,当然那里没有代码。

所以我怀疑你在堆栈上的某个阵列上越界了。

通过查看您的代码,我发现了两件可疑的事情:

  • 预取数组的大小是4096,但是你用参数65546调用database_select_end。也许它没问题(不知道那个函数是做什么的)但是可能不是;)

  • 65546不是2的幂.2 ^ 16 = 65536

答案 2 :(得分:0)

我通过使用不同的函数名编写相同的代码来解决问题。这对我来说太奇怪了,因为它解决了我的问题。我不知道为什么。