讓人束手無策的錯誤訊息

各位先進,剛開始學習LabVIEW的我接手一支已上線多時的系統,但客戶也已回報多時的嚴重錯誤,也一直讓小弟束手無策,錯誤訊息如下:

LabVIEW: An expection occurred within the external code
called by a Call Library Node.This might have corrupted
LabVIEW’s Memory.Save any work to a new location and
restart LabVIEW.

VI “XXXXXX.vi” was stopped at node 0xDC of subVI
“IMAQ ROIToMask”

小弟在此發問這問題前也曾搜尋過網路,好像也沒有相對應的解決方法(還是答案近在眼前,高手覺得發問者不夠用功,懶的理會),在此整理出一些我認為的大概方向,盼各位先進提供給我一些可能的解決方向。

1. 發生此類問題的LabVIEW版本好像是7.1或7.1.1
2. 問題發生頻率都不太高,所以很難找出脈絡
3. 每次發生問題的地方,雖集中在某幾個點,但不是每次都一樣
4. 有人懷疑是與OS的記憶體管理有關
5. 有人懷疑是與該電腦是否有安裝過不同版本的LabVIEW Runtime
6. 有人懷疑是該電腦的Registry有過多不該存在的設定


P.S. 有人提供給我一個暫時的解決方式,就是先想辦法把錯誤訊息吃掉,不讓它顯示和中斷程式的運作,可是我想這可能會造成後續程式的誤動作,所以我就還沒嘗試這方法。
Jimy39433.4371759259

這是Call dll常常出現的問題,你所使用的dll可能在某個記憶體區域與windos的記憶體區域重疊.或給定的參數不正確.

例如:

Function_A(A int,B int,C int) as int需要3個參數,但是,你只給定A,B二個參數,這樣就會出現上面這個問題.

感謝jimmy-Chen的說明。

不過如果是少參數的問題,一來按NI的習慣(這裡的訊息告訴我,錯誤是發生在NI出的IMAQ的Library),Required的端點沒接線,RUN的按鈕一定會出現斷裂;二來每次執行到這邊一定都會出現如此的錯誤訊息。

而上述的兩個現象,在我現在的程式中都沒有發現,所以我會認為應該不是這樣的問題。

如果我有誤解jimmy-Chen您的意思,還請您指正。
Jimy39427.3523148148

請問一下, 你的程式中是否有一個副程式用在兩個地方? 試試勾選 "Reentrant execution" 再重新build 一次

此選項在 VI Properties 中

這個Reentrant的問題我倒是沒想到,非常感謝free的提醒。

我看了一下程式,由於這一類的錯誤發生在不同的地方,如果都要補齊所有的Reentrant選項,那可要花費一番功夫,所以我先以反證的方式來思考這個問題。

剛看了一篇關於LabVIEW的Reentrant的文章,結果發覺LabVIEW對程式的Multi-thread處理原則與我原先的認知有很大的出入,所以我修改了我的發言,還請各位諒解。

由那篇文章的敘述,我反而覺得這類的錯誤跟Reentrant沒有太大的關連了。Jimy39428.4834837963

[QUOTE=Jimy] 漂亮,這個Reentrant的問題我倒是沒想到,非常感謝free的提醒。

我看了一下程式,由於這一類的錯誤發生在不同的地方,如果都要補齊所有的Reentrant選項,那可要花費一番功夫,所以我先以反證的方式來思考這個問題。

這系統真的有可能在同一時間由不同地方呼叫同一VI,是該啟動Reentrant選項。但我也找到只有單一地點呼叫也出現過這類的錯誤,所以這個反證也有可能推翻「是Reentrant造成這類錯誤」的這個假設。

如果再進一步研究,我覺得那些供其他VI呼叫的SubVI應該都要把Reentrant勾選起來才是(除了那些只當DLL程序中介的簡單型VI以外),實際上我找了一下NI自己Library中的VI,有勾選Reentrant選項的卻很少,蠻奇怪的。 [/QUOTE]

如果你往底層看是呼叫dll的方式其實都是設定為Reentrant的

請你確認在開發端電腦和target端電腦的dll版本是否一樣?請看以下相關路徑

![](upload://5O0R29vvN8Qy4dRbgzIcYZa1W99.jpeg)

謝謝Ancle的建議,我會去注意一下DLL版本差異的問題。

[QUOTE=Jimy]謝謝Ancle的建議,我會去注意一下DLL版本差異的問題。 [/QUOTE]

如果可以的話,請你將結果再po上來

PS.假如是dll版本不一樣的話你只要將目將開發端的dll複製到target端覆蓋掉原來的dll即可

不知問題是否已解決?

經我比對客戶端與我電腦上NIVision.dll的版本,版本確實是不一致,但我也已經直接覆蓋過去,結果還是沒有起色。

不過還是感謝Ancle的關心。

有沒有機會是資料流出了問題

資料在進入"IMAQ ROIToMask"此sub.vi之前就出了問

之前遇過類似的問題,都是因為前端資料出現問而導致下一個vi出現不應該出現的問題

感謝Marco提供寶貴的經驗。

您的想法我也頗有同感,只是在這功能所在的檢測迴圈內,並不是每次都會出錯,只是偶而,且LabVIEW提供的資訊有限,沒有辦法去發現問題之所在。

能否請Marco不吝提供您以前發現問題的方法,好讓我有依循的方式來解決這困惑已久的問題。

其實我只用Probe一個一個下去看

因為不是每次都會發生

所以在抓這種問題時

通常我都要花個半天一天的去看

如果程式是自己寫的,就應該不會這樣了

看別人的程式,最害這樣不穩定的狀況了