五十一、UDF錯(cuò)誤代碼排查
1.UDF錯(cuò)誤代碼排查
UDF出錯(cuò)如何進(jìn)行錯(cuò)誤排查???
?
1.1有錯(cuò)誤信息顯示
根據(jù)錯(cuò)誤信息定位到具體錯(cuò)誤類(lèi)型,如代碼錯(cuò)誤、命名錯(cuò)誤、內(nèi)存分配錯(cuò)誤或線程錯(cuò)誤等問(wèn)題。詳細(xì)可查看五十、UDF常見(jiàn)錯(cuò)誤及報(bào)錯(cuò)信息
1.2無(wú)錯(cuò)誤信息顯示
常見(jiàn)問(wèn)題介紹了很多有錯(cuò)誤信息的UDF問(wèn)題,這類(lèi)問(wèn)題一般比較容易定位錯(cuò)誤,能夠更容易的解決。
但是還存在一類(lèi)build之后沒(méi)有任何錯(cuò)誤信息的代碼,編譯能正常編譯,但是只要calculation或者初始化就會(huì)出錯(cuò),這類(lèi)問(wèn)題如果實(shí)在找不到問(wèn)題,那就進(jìn)行逐句排查。
?
2.排查舉例
比如一個(gè)曾經(jīng)困擾我一整天的問(wèn)題:
以上代碼看起來(lái)沒(méi)有任何問(wèn)題,導(dǎo)入Fluent,編譯之后報(bào)錯(cuò),出現(xiàn)以下錯(cuò)誤信息
?
顯示第一行出錯(cuò),但是第一行確實(shí)沒(méi)有任何問(wèn)題。到底哪里有問(wèn)題呢??你能不能看出來(lái)??
?
雖然這個(gè)例子有錯(cuò)誤信息,但是這個(gè)錯(cuò)誤信息卻是一種誤導(dǎo)。如果真想找到問(wèn)題應(yīng)該怎么做??
?
首先把DEFINE宏{}內(nèi)所有的代碼行全部刪除或注釋掉,再次編譯,查看是否有錯(cuò)誤信息。如果是點(diǎn)擊calculation才會(huì)出錯(cuò)的,則需要?jiǎng)h除代碼后點(diǎn)擊calculation。
點(diǎn)擊build之后,控制臺(tái)出現(xiàn)界面如下,沒(méi)有報(bào)錯(cuò)。
然后依次還原各行代碼,對(duì)于比較簡(jiǎn)單的代碼,不需要驗(yàn)證可直接還原。將前三句代碼還原
點(diǎn)擊build,出現(xiàn)如下信息,沒(méi)有報(bào)錯(cuò)。
?
再次還原代碼
點(diǎn)擊build之后,又出現(xiàn)報(bào)錯(cuò)信息
?
由此我們可以定位到錯(cuò)誤代碼
到底哪里有問(wèn)題呢??
經(jīng)過(guò)我反復(fù)實(shí)驗(yàn),原來(lái)是注釋出了問(wèn)題。C語(yǔ)言有兩種注釋方法//和/*.......*/。這一行的注釋//*0.8.........乘以0.8的*被C語(yǔ)言認(rèn)為是注釋語(yǔ)句,因此兩種注釋疊用,導(dǎo)致出錯(cuò)。只要將*去掉就可以。
上面的例子只是為了做一下示范,實(shí)際上的UDF代碼更加復(fù)雜,問(wèn)題也更加多樣。如果通過(guò)錯(cuò)誤提示或者經(jīng)驗(yàn)都找不到錯(cuò)誤,使用這種方式雖然繁瑣,但基本是通用的,幾乎所有的問(wèn)題代碼都能找到。
?
?
公眾號(hào):Fluent學(xué)習(xí)筆記
為了方便大家學(xué)習(xí)交流,我創(chuàng)建了QQ群:466988009,大家可以在其中討論相關(guān)的問(wèn)題,同時(shí)我會(huì)將所有文章的源文件都放到QQ群中,還會(huì)放一些其它的學(xué)習(xí)文件。歡迎大家加入。
?