2017-10-10 200 views
5

我正在運行由其他人編寫的Fortran 77程序。我在Linux上使用gfortran編譯器(v5.4.0)(Ubuntu v.16.04)。我不是Fortran,gcc或bash腳本的經驗豐富的用戶,所以我在這裏掙扎。解釋gfortran錯誤追溯

當我的程序運行完成後,我得到以下信息:

Note: The following floating-point exceptions are signalling: IEEE_DENORMAL

我不得不看這件事 - 據我所知,我的一些浮點數的需要存儲「非正規」,對於很小數量的低精度表格(而不是將它們清零)。這些來自程序中不穩定的空氣動力學計算 - 我在進行計算時看到了這一點。這是不太可能的是,這些非正規量都顯著影響了我的成績,但是,試圖找出/爲什麼這是怎麼回事,我試着用下面的錯誤選項編譯:

gfortran –g –fbacktrace –ffpe-trap=invalid,zero,overflow,underflow,denormal –O3 –mcmodel=medium –o ../program.exe

程序編譯,但在運行時墜毀並返回:

Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation. 

Backtrace for this error: 
#0 0x7F442F143E08 
#1 0x7F442F142F90 
#2 0x7F442EA8A4AF 
#3 0x4428CF in subroutine2_ at code.f:3601 (discriminator 3) 
#4 0x442C3F in subroutine1_ at code.f:3569 
#5 0x4489DA in code_ at code.f:428 
#6 0x42BdD1 in MAIN__ at main.f:235 
Floating point exception (core dumped) 

我可以解釋這些是調用的層次結構,從6比3落後的工作:

* 6。在「main.f」的第235行,有一個問題。 [這是致電「code.f」]

* 5。在「code.f」的第428行,有一個問題。 [這是對「code.f」中的「subroutine1」的調用]

* 4。在「code.f」的第3569行,在「子程序1」中,出現了問題。 [這是對「code.f」中的「subroutine2」的調用]

* 3。在「code.f」的第3601行,在「子程序2」中,出現了問題。 [這是一個條件語句]

if (windspd_2m.ge.5.0) then...

所以非正規錯誤必須在「然後」操作中發生(因爲(a)它涉及到一個長期,複雜的一系列的依賴我沒有將這些代碼,(b)我可以解開數學錯誤,這是我正在努力解決的調試錯誤)。

但是對於上述錯誤2,1,0 ...我不知道如何解釋這些字符串的數字/字母。我也不知道「鑑別器3」的含義。我搜索了這些,但我發現的唯一資源解釋了他們假設的知識水平比我高。任何人都可以幫助我解釋這些錯誤代碼,假設Fortran,gcc或bash腳本的知識已經很少了?

+0

您正處在正確的軌道上。你的程序崩潰是因爲你用'-ffpe-trap = ...'告訴它在浮點異常時崩潰。前三個堆棧幀很可能是對庫或內部函數的調用,它們處理實際的錯誤處理。我不會太擔心這些。 – chw21

+0

好的,謝謝@ chw21!這聽起來像進入源代碼,並找到denom的來源是解決這個問題的最好方法。有可能在計算中保留denom數字是合理的,這取決於它們在哪裏。我會更多地考慮'-ffpe-trap'的控制 - 如果我可以讓它產生一個警告而不是崩潰程序會更好。 –

+0

*編輯:「denom」應該是「denormal」 –

回答

2

前三個堆棧幀是由於在GFortran運行時庫(libgfortran)中執行回溯。回溯無法象徵性地解析動態庫中的地址,因此您只能獲取地址。如果你想看符號輸出,你可以在你的編譯選項中加上「-static」。

因此,我的第一個猜測是錯誤是在code.f:3601,並且由於5.0是一個常數,因此windspd_2m應該是反規範的。

+0

嗨@janneb,謝謝!我不知道什麼是動態圖書館,所以我會去了解一下。我現在試試-static選項。 對於code.f:3601處的錯誤,您的結論是有道理的,但windpsd_2m是直接從不包含非規範值的天氣時間序列中繪製的。因爲這是一個條件,我認爲這個錯誤出現在「then」語句中,我在文章中總結爲「...」,因爲這個塊相當大。我想知道是否這是「鑑別器3」的回溯意味着什麼......不知何故指示「那麼」塊的哪個部分是信號傳輸......這有意義嗎? –

+0

好吧,我已經完成了靜態與動態鏈接的作業 - 看起來很重要,很高興我將它添加到我的知識庫中。在編譯時加入「-static」確實會爲這3幀返回符號輸出。但是,輸出並不會產生新的信息,因爲這些幀是對gsignal,gfortran回溯處理程序和gfortran回溯本身的調用。 因此,錯誤必須在code.f:3601開始的條件語句內。時間檢查我的數學! –