2011-01-21 31 views
3

我正在使用函數庫函數ConnectToTCPServer。當主機不可訪問時,此功能超時。在這種情況下,應用程序崩潰並出現以下錯誤: 「非致命的運行時錯誤:」MyClient.c「,第93行,第15行,線程ID 0x000017F0:庫函數錯誤(返回值== -11 [0xfffffff5] )。超時錯誤「我如何在ansi C90中捕獲運行時錯誤

Errorcode 11是一個超時錯誤,所以這可能經常發生在我的應用程序中 - 但是應用程序崩潰 - 我想趕上這個錯誤,而不是讓我的應用程序崩潰。

如何在Ansi C90中捕獲此運行時錯誤?

編輯: 這裏是目前使用的Codesnippet:

ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout); 

int HPMClientCb(UINT handle, int xType, int errCode, void *transData){ 
    printf("This was never printed\n"); 
    return errCode; 
} 

的callbackFunction參數永遠不會被調用。我的服務器沒有運行,所以ConnectToTCPServer會超時。我會懷疑這個回調是被調用的 - 但它永遠不會被調用。

編輯2:實際上不調用回調函數,ConnectToTCPServer的Returnvalue包含相同的錯誤信息。我認爲這可能是一個錯誤ConnectToTCPServer引發此錯誤。我只需要抓住它並將其存入C90。有任何想法嗎?

編輯3:我測試了回調函數,在我的服務器在線的罕見occaision實際上調用回調函數 - 這並沒有幫助,因爲當發生錯誤時不會調用回調函數。

回答

3

尋找NI文檔中,我看到:
「庫錯誤斷點 - 每當LabWindows/CVI的庫函數在運行時會返回一個錯誤您可以設置一個選項,以中斷程序執行。」

我會推測他們有一個調試選項,導致程序停止運行時錯誤,您需要在配置中,編譯時或運行時禁用該錯誤。

我的第一個猜測將是配置值或編譯標誌,但是這是我發現的唯一的選擇,這是一個運行時選項:
// If debugging is enabled, this function directs LabWindows/CVI not
// to display a run-time error dialog box when a National Instruments
// library function reports an error.
DisableBreakOnLibraryErrors();

說,如果它幫助。

0

通常情況下,您應該能夠簡單地檢查返回值。事實上,你的應用程序退出意味着某些東西已經在捕捉錯誤並斷言(或類似的東西)。沒有看到任何上下文(即代碼演示你如何使用這個函數),很難做到更精確。

+0

我提供了一個簡約的例子 - 我相信這個錯誤在圖書館裏被抓住,然後扔進我的應用程序,我不知道如何處理它。 – Johannes 2011-01-21 12:31:42

1

從文檔看來,當發生錯誤時,您應該打電話給您的clientCallbackFunction。如果你不這樣做,你應該編輯你的問題來澄清。

+0

我的clientCallbackFunction實際上從來沒有被調用過。 – Johannes 2011-01-21 12:32:16

+0

我完全沒有從文檔中得知。在我看來,只有在服務器有TCP_DISCONNECT或TCP_DATAREADY事務時才應該調用回調函數。 – 2011-02-14 10:45:25

2

Theres沒有像在標準C中「捕捉」錯誤(或「異常」)的一般情況那樣的事情。這取決於您的庫決定如何處理它。可能會記錄它的狀態,然後簡單地調用abort()。在Unix中,這表明SIGABRT可以處理,而不僅僅是退出()編輯。或者他們的庫可能只是正在記錄,然後調用exit()。

您可以在strace等實用程序下運行您的應用程序,以查看正在執行的系統調用以及哪些信號被聲明。

如果您無法取得任何進展,我會與您的供應商合作。

1

我不知道我理解你。

我查看了庫函數ConnectToTCPServer()的文檔。它返回一個int; 0表示成功,負數表示錯誤代碼。

EDIT: Here is a Codesnippet of the current use:

ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout); 

如果這是真正的當前使用,你似乎並不試圖告訴ConnectToTCPServer()是否成功。要做到這一點,你需要

int err_code; 
... 
err_code = ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout); 

然後測試err_code。

documentation for ConnectToTCPServer()意味着您的回調函數將不會被調用,除非有來自TCP服務器的消息。沒有服務器,沒有消息。在這種情況下,

  1. ConnectToTCPServer()應返回一個負數。
  2. 您應該檢查返回值ConnectToTCPServer()
  3. 在那裏找到一個負數,你應該做一些明智的事情。

我是否正確理解文檔?

+0

我簡化了一點。通過將返回值存儲在變量中,情況不會改變。 – Johannes 2011-02-14 10:10:34

+0

您的編輯3表示您希望在發生錯誤時調用回調函數。從閱讀文檔,我不會指望。我希望你的回調只有在TCP服務器有TCP_DISCONNECT或TCP_DATAREADY事務時纔會被調用。我不會認爲錯誤是任何一種交易類型。 – 2011-02-14 10:41:38

0

該文檔指出ConnectToTCPServer將返回錯誤代碼。只有在建立連接,斷開連接或準備好讀取數據時纔會調用回調。

您收到的消息指出錯誤是非致命的,因此它不應該中止。如果你確定代碼不會在以後中止,它看起來確實像是庫中的一個錯誤。

我對CVI並不熟悉,但可能有(編譯/運行時)選項即使在非致命錯誤(用於調試目的)時也會中止。如果你能在最小的例子中重現這一點,你應該report it to NI