Domanda

Sto usando la funzione di libreria ConnectToTCPServer . Questa funzione timeout quando l'host non è raggiungibile. In tal caso, l'applicazione si blocca con il seguente errore: "NON FATALE Errore di runtime: "MyClient.c", linea 93, col 15, filo id 0x000017F0:. Errore di funzione di libreria (valore di ritorno == -11 [0xfffffff5]) Errore di timeout"

Il Errorcode 11 è un timeout errore, quindi questo potrebbe accadere abbastanza spesso nella mia applicazione - tuttavia l'applicazione si blocca -. vorrei prendere questo errore, piuttosto che avere la mia crash dell'applicazione

Come posso prendere questo errore di runtime in ANSI C90?

EDIT: Ecco una Codesnippet di uso corrente:

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

con

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

Il callbackFunction non viene mai chiamato. Il mio server non è in esecuzione, in modo ConnectToTCPServer sarà timeout. Ho il sospetto che il callback viene chiamata -. Ma non è mai è chiamato

EDIT 2: La funzione richiamata non è effettivamente chiamato, il returnValue ConnectToTCPServer contiene le stesse informazioni di errore. Penso che potrebbe essere un bug che ConnectToTCPServer getta questo errore. Ho solo bisogno di prenderlo e bin in C90. Tutte le idee?

EDIT 3:. Ho testato il callbackFunction, nelle rare occaision che il mio server è in linea la funzione di callback è in realtà chiamato - questo non aiuta, però, perché la richiamata non viene chiamato quando si verifica un errore

È stato utile?

Soluzione

In cerca nella documentazione NI, vedo questo:
"Breakpoint errore di libreria -. È possibile impostare un'opzione per interrompere l'esecuzione del programma ogni volta che una funzione di LabWindows / CVI biblioteca restituisce un errore durante la fase di esecuzione"

I speculare che hanno un opzione di debug per causare il programma di fermata in caso di errori di runtime, che è necessario disabilitare nella configurazione, in fase di compilazione o in fase di esecuzione.

La mia prima risposta sarebbe stato il valore di configurazione o la bandiera compilazione, ma questa è l'unica opzione che ho trovato, che è un'opzione di run-time:
// 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();

Di 'se ha aiutato.

Altri suggerimenti

C'è una cosa come un caso generale di "catturare" un errore (o un 'eccezione') in serie C. Questo è fino a vostra libreria per decidere che cosa fare con esso. Probabilmente la sua registrazione il suo stato e poi semplicemente chiamare abort (). In Unix, che i segnali SIGABRT che può essere trattata e non solo uscita () ed. O la loro biblioteca può essere solo la registrazione e quindi chiamando exit ().

Si potrebbe eseguire l'applicazione nell'ambito di un programma di utilità come strace per vedere che cosa le chiamate di sistema sono che viene svolta e quali segnali vengono fatti valere.

mi piacerebbe lavorare con il fornitore se non è possibile fare alcun passo avanti in altro modo.

Dalla documentazione, a quanto pare si dovrebbe ottenere una chiamata al clientCallbackFunction in caso di errore. Se non lo fai, si dovrebbe modificare la tua domanda per chiarire che.

Non ne sono sicuro ti capisco.

Ho guardato la documentazione per la funzione ConnectToTCPServer() biblioteca. Esso restituisce un int; 0 significa successo, i numeri negativi sono i codici di errore.

EDIT: Ecco un Codesnippet della uso corrente:

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

Se questo è davvero l'uso corrente, non sembrano essere cercando di dire se ConnectToTCPServer() riesce. Per fare questo, si avrebbe bisogno

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

e quindi verificare ERR_CODE.

La documentazione per ConnectToTCPServer() implica che la funzione di callback non sarà chiamato a meno che non ci sia un messaggio da un server TCP. Nessun server, nessun messaggio. In questo caso,

  1. ConnectToTCPServer() dovrebbe restituire un numero negativo.
  2. Si dovrebbe controllare il valore di ritorno di ConnectToTCPServer().
  3. Trovare un numero negativo lì, si dovrebbe fare qualcosa di sensato.

ho capito la documentazione correttamente?

Normalmente, si dovrebbe essere in grado di controllare semplicemente il valore di ritorno. Il fatto che le vostre uscite applicazione implica che qualcosa sta già prendendo piede l'errore e di affermare (o qualcosa di simile). Senza vedere qualsiasi contesto (vale a dire il codice che dimostra come si sta utilizzando questa funzione), è difficile essere più precisi.

La documentazione afferma che ConnectToTCPServer restituirà il codice di errore. Il callback viene chiamato solo se la connessione è stabilita, scollegato o quando ci sono dati pronto per essere letto.

Il messaggio che si ottiene afferma che l'errore è non fatali, quindi non debba interrompersi. Se sei sicuro il codice non abortire più tardi sembra davvero come un insetto nella biblioteca.

Non ho familiarità con CVI, ma ci potrebbe essere una soluzione (di compilazione / runtime-) per sospendere anche in caso di errori non fatali (per il debug). Se è possibile riprodurre questo in un esempio minimo si dovrebbe segnalarlo a NI .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top