2011-03-03 62 views
0

当我试图调试在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

我假设你拿到源代码并重新编译它,并没有使用交叉编译器或类似的东西。 – rerun 2011-03-03 06:19:35

+0

发布代码将有所帮助。 – Mahesh 2011-03-03 06:21:59

+0

它超过700线路编码。 :/不能'把那些因为论坛只允许超过500个字符 – kevin 2011-03-03 06:28:14

回答

1

无效的访问可能会在标准库中的代码某处发生的代码。 Express版的源代码不可用。

您可能会检查调用堆栈以获取调用库函数的代码部分,然后从中调用它。

+0

对不起如何检查调用堆栈和调试,我是C新手。 – kevin 2011-03-03 06:26:50

+2

有点晚,但无论如何:如果你在调试模式下运行你的程序,并得到“找不到源”消息,应该有一个调用堆栈调试器中的窗口,列出所有活动功能。只需滚动,直到找到您认可的功能。这应该是你在哪里调用无源代码的地方。 – 2011-03-03 15:48:51

0

前段时间我有类似的问题,也许它与你的有关?

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

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

所以我怀疑你超出了堆栈上的某个数组的界限。

通过看你的代码,我看到了两个可疑的东西:

  • 您的预取数组的大小是4096,但是你叫database_select_end与参数65546.也许它是确定(不知道是什么功能一样),但也许不是)

  • 65546不是2 2^16 = 65536

+0

谢谢。事实上,当我追踪它时,只要它进入上面的第二行就会显示错误!它甚至没有机会获得** database_select_end **语句。输入错误时显示错误op_ds_bulk(u_int ops,u_int * totalp,int update) {**。 – kevin 2011-03-03 08:27:37

0

的功率余通过与编写相同的代码解决了这个问题一个不同的函数名称。这对我来说很奇怪,因为它解决了我的问题。我不知道为什么。

相关问题