2011-03-03 61 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

的功率餘通過與編寫相同的代碼解決了這個問題一個不同的函數名稱。這對我來說很奇怪,因爲它解決了我的問題。我不知道爲什麼。

相關問題