2011-01-21 2 views
3

라이브러리 ConnectToTCPServer 라이브러리를 사용하고 있습니다. 이 기능은 호스트에 연결할 수없는 경우 시간을 초과합니다. 이 경우 응용 프로그램이 다음 오류로 인해 충돌합니다. "중요하지 않은 런타임 오류 :"MyClient.c ", 줄 93, 열 15, 스레드 ID 0x000017F0 : 라이브러리 함수 오류 (반환 값 == -11 [0xfffffff5]) 시간 초과 오류 "어떻게 ansi C90에서 런타임 오류가 발생합니까?

Errorcode 11은 시간 초과 오류이므로 내 응용 프로그램에서 매우 자주 발생할 수 있습니다. 그러나 응용 프로그램이 충돌합니다. 응용 프로그램이 충돌하는 대신이 오류를 catch하고 싶습니다.

어떻게 Ansi C90에서이 런타임 오류를 잡을 수 있습니까?

편집 :

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가 호출되지 않습니다 : 다음은 현재 사용의 Codesnippet입니다. 내 서버가 실행 중이 아니므로 ConnectToTCPServer가 시간 초과됩니다. 나는 그 콜백이 호출되었다고 의심 할 것이다. 그러나 그것은 결코 호출되지 않는다.

EDIT 2 : 실제로 콜백 함수가 호출되지 않고 ConnectToTCPServer의 반환 값은 동일한 오류 정보를 포함합니다. ConnectToTCPServer이이 오류를 throw하는 버그 일 수 있습니다. 나는 그것을 잡아야하고 C90에 보관해야합니다. 어떤 아이디어?

EDIT 3 : 드물게 내 서버가 온라인 상태 인 콜백 함수를 실제로 테스트했습니다. 오류 발생시 콜백이 호출되지 않기 때문에 콜백 함수가 실제로 호출됩니다.

답변

3

NI 설명서에 보면, 나는이를 참조하십시오
"라이브러리 오류 중단 점을 - LabWindows/CVI 라이브러리 함수가 런타임시 오류를 반환 할 때마다 당신은 프로그램 실행을 중단하는 옵션을 설정할 수 있습니다."

I을 컴파일 시간이나 런타임에 구성에서 사용하지 않도록 설정해야하는 런타임 오류가 발생하면 프로그램을 중지시키는 디버그 옵션이 있다고 추측합니다.

내 첫번째 추측은 설정 값 또는 컴파일 플래그했을 것이다, 그러나 이것은 런타임 옵션입니다 내가 찾은 유일한 옵션이다 :
// 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

나는 아팠고 현재 이것을 테스트 할 수 없습니다. 테스트 할 수 있습니다. 2 주 후입니다. – Johannes

+1

감사합니다. -이 도움이되었습니다 ... 죄송합니다. 나는 즉시 응답하지 않았습니다. 고객의 요구에 따라 8 주 동안 방안에 잠겼습니다. – Johannes

0

일반적으로 반환 값을 간단히 확인할 수 있어야합니다. 응용 프로그램이 종료된다는 사실은 이미 무언가가 오류를 잡아 내고 있음을 암시합니다 (또는 비슷한 것). 문맥 (예 :이 기능을 사용하는 방법을 보여주는 코드)을 보지 않아도 더 이상 정확하게 표현하기가 어렵습니다.

+0

최소한의 예제를 제공했습니다. 오류는 librarie에서 잡아 당겨서 응용 프로그램에 던져 넣을 수있는 방법을 모릅니다. – Johannes

1

설명서에서 오류가 발생하면 clientCallbackFunction으로 전화해야합니다. 그렇지 않으면 질문을 편집하여 명확하게해야합니다.

+0

내 clientCallbackFunction은 실제로 호출되지 않습니다. – Johannes

+0

설명서에서 전혀 얻지 못했습니다. 서버에서 TCP_DISCONNECT 또는 TCP_DATAREADY 트랜잭션이있을 때만 콜백 함수를 호출해야합니다. –

2

표준 C에서 오류 (또는 '예외')를 "포착"하는 일반적인 경우는 없습니다. 라이브러리와 관련하여 작업을 결정하십시오. 가능성이 자사의 상태를 로깅 후 단순히 호출 abort(). 유닉스에서, 그 신호는 SIGABRT으로 처리 할 수 ​​있고 exit()하지 않을 수있다. 또는 해당 라이브러리가 로깅 한 다음 exit()를 호출 할 수 있습니다.

strace과 같은 유틸리티로 응용 프로그램을 실행하면 어떤 시스템 호출 이 수행되고 있는지, 어떤 신호가 어설 션되는지 알 수 있습니다 ().

달리 서두르지 않으면 해당 공급 업체와 협력 할 것입니다.

1

잘 모르겠습니다.

라이브러리 기능 ConnectToTCPServer()에 대한 설명서를 살펴 보았습니다. int를 반환합니다. 0은 성공을 의미하고 음수는 오류 코드입니다.

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

이 정말 현재 사용의 경우

EDIT: Here is a Codesnippet of the current use:

, 당신은 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

+0

Edit 3은 오류가 발생했을 때 콜백 함수가 호출 될 것으로 기대한다고 말합니다. 문서를 읽는 것으로부터 나는 그것을 기대하지 않을 것입니다. TCP 서버의 TCP_DISCONNECT 또는 TCP_DATAREADY 트랜잭션이있을 때만 콜백이 호출되기를 기대합니다. 나는 그 트랜잭션 유형 중 하나 인 오류를 고려하지 않을 것이다. –

0

설명서에 ConnectToTCPServer이 오류 코드를 반환한다고 나와 있습니다. 콜백은 연결이 설정되거나 연결이 끊어 지거나 읽을 준비가 된 데이터가있는 경우에만 호출됩니다.

메시지에 오류가 NON-FATAL이라고 표시되므로 중단해서는 안됩니다. 나중에 코드가 중단되지 않는다고 확신하는 경우 실제로 라이브러리의 버그처럼 보입니다.

저는 CVI에 익숙하지 않지만, 치명적이지 않은 오류 (디버깅 목적)에서도 중단 할 수있는 (컴파일/런타임) 옵션이있을 수 있습니다. 최소한의 예제에서 이것을 재현 할 수 있다면 report it to NI이어야합니다.

+0

나는 NI에 연락했다 - 그들은 그것을 조사하고있다. – Johannes

+0

다른 의견을 읽으면서 오류 처리 방법을 오해하고있는 것처럼 보입니다. 반환 값을 저장하고 오류 코드를 확인해야합니다. 함수가 결코 반환하지 않는 경우에만 라이브러리 오류입니다. 라이브러리가 오류 코드를 반환하고 콜백을 호출하지 않는 것은 완전히 합법적입니다. – chris