2010-05-17 23 views
2

我正在使用Intel的FORTRAN編譯器來編譯數字庫。測試用例在libc.so.6中提供了錯誤。當我連接英特爾的調試器(IDB)時,應用程序成功運行。如何調試調試器阻止錯誤的錯誤?請注意,gfortran出現同樣的錯誤。這個錯誤不會與調試器連接

我在OpenSUSE 11.2 x64中工作。

錯誤是:

forrtl:重度(408):堡:(3):數組B的下標#1具有值-534829264小於下界1

回答

3

的的錯誤信息對我來說很清楚,你正試圖訪問一個不存在的數組元素。我懷疑當使用一個未初始化的變量來標識數組中的元素或整數算術溢出的結果時,-534829264值是垃圾。無論哪種方式,你應該打開編譯標誌強制數組邊界檢查和運行一些測試。我認爲英特爾編譯器的標誌是-CB,但請檢查文檔。至於爲什麼程序顯然能夠在調試器中成功運行,我無法提供多少幫助,但也許調試器會在運行時系統本身沒有的變量上施加一些默認值。或者其他一些因素完全負責。

編輯:

不運行時系統告訴你什麼行代碼導致該問題?還有一些事情要嘗試診斷問題。使用編譯器警告你

  • 在變量被初始化之前使用變量;
  • 整數算術溢出(不知道編譯器是否可以識別這個?);
  • 在同一類型中從一種類型到另一種類型以及從一種類型到另一種類型的強制轉換。

此外,檢查默認的整數大小是你期望它是什麼,更重要的是,其餘的代碼預計它是什麼。

+0

謝謝。任何提示找到電話來自哪裏?恐怕我被Visual Studio寵壞了。 – ccook 2010-05-17 10:49:00

+0

謝謝你的提示,但是這是在一個已發佈的圖書館(FISHPACK)。我收到的錯誤沒有源信息。我得到類似於: tblktri 00000000004A6AED未知未知未知 tblktri 00000000004A55F5未知未知未知 libc.so.6 00007FAD079D6A7D未知未知未知 – ccook 2010-05-17 11:24:58

+0

感謝Mark。我做到了。我也在使用他們的測試用例,所以他們所有的代碼。我瀏覽了代碼,他們似乎是在其中一種方法的索引計算上出現錯誤。我不確定它是否僅僅表現自己,因爲我使用的是不同的編譯器。我以我發現的內容向作者發送電子郵件。謝謝您的幫助! – ccook 2010-05-17 13:27:23

1

不在上述區域,但兩件事情的專家認爲:

1)是調試器初始化作爲指數第一爲零的變量,但非調試不會等變量開頭一個「垃圾」價值(有一箇舊版本的Pascal曾經這樣做)。

2)你使用線程?如果是,則調試更改執行順序,以便一些準備線程及時完成。

+0

謝謝你的觀點。幸運的是,我沒有使用線程。 – ccook 2010-05-17 10:49:40