Как я могу поймать ошибку во время выполнения в ANSI C90 - PullRequest
3 голосов
/ 21 января 2011

Я использую библиотеку Функция ConnectToTCPServer .Эта функция отключается, когда хост недоступен.В этом случае происходит сбой приложения со следующей ошибкой: «НЕФАТАЛЬНАЯ ОШИБКА ЗАПУСКА:« MyClient.c », строка 93, столбец 15, идентификатор потока 0x000017F0: Ошибка функции библиотеки (возвращаемое значение == -11 [0xfffffff5]). Timeout error "

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;
}

Функция обратного вызова никогда не вызывается.Мой сервер не работает, поэтому время ожидания ConnectToTCPServer истечет.Я подозреваю, что обратный вызов вызывается - но он никогда не вызывается.

РЕДАКТИРОВАТЬ 2: Функция обратного вызова на самом деле не вызывается, значение возврата ConnectToTCPServer содержит ту же информацию об ошибке.Я думаю, что это может быть ошибка, что ConnectToTCPServer выдает эту ошибку.Мне просто нужно поймать его и скопировать в C90.Любые идеи?

РЕДАКТИРОВАТЬ 3: Я тестировал функцию обратного вызова, в редких случаях, когда мой сервер подключен к сети, фактически вызывается функция обратного вызова - хотя это не помогает, потому что обратный вызов не вызывается при возникновении ошибки.

Ответы [ 6 ]

3 голосов
/ 03 февраля 2011

Глядя в документацию NI, я вижу это:
«Точки останова ошибки библиотеки - Вы можете установить опцию, чтобы прервать выполнение программы всякий раз, когда библиотечная функция LabWindows / CVI возвращает ошибку во время выполнения».

Я бы предположил, что у них есть опция отладки, позволяющая программе останавливаться при ошибках во время выполнения, которые необходимо отключить в конфигурации, во время компиляции или во время выполнения.

Моим первым предположением было бы значение конфигурации или флаг компиляции, но это единственная найденная опция, которая является опцией времени выполнения:
// If debugging is enabled, this function directs LabWindows/CVI not<br> // to display a run-time error dialog box when a National Instruments<br> // library function reports an error.<br> DisableBreakOnLibraryErrors();<br>

Скажите, помогло ли это.

2 голосов
/ 28 января 2011

Нет такого понятия, как общий случай «перехвата» ошибки (или «исключения») в стандартном C. Это зависит от вашей библиотеки, чтобы решить, что с ней делать.Скорее всего, он регистрирует свое состояние, а затем просто вызывает abort ().В Unix это сигналы SIGABRT, которые можно обрабатывать, а не просто выходить () ed.Или их библиотека может просто регистрировать и затем вызывать exit ().

Вы можете запустить свое приложение под утилитой типа strace, чтобы увидеть, какие системные вызовы выполняются и какие сигналыбудучи утвержденным.

Я бы поработал с вашим поставщиком, если вы не можете добиться успеха в противном случае.

1 голос
/ 30 января 2011

Я не уверен, что понимаю вас.

Я посмотрел документацию для библиотечной функции ConnectToTCPServer().Возвращает int;0 означает успех, отрицательные числа - это коды ошибок.

РЕДАКТИРОВАТЬ: Вот кодекс текущей версии:

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

Если это действительно текущее использованиевы, кажется, не пытаетесь сказать, удастся ли ConnectToTCPServer().Для этого вам нужно

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

и затем проверить err_code.

Документация для ConnectToTCPServer() подразумевает, что ваша функция обратного вызова не будет вызываться, если нет сообщения от TCP-сервера.Нет сервера, нет сообщения.В этом случае

  1. ConnectToTCPServer() должен возвращать отрицательное число.
  2. Вы должны проверить возвращаемое значение ConnectToTCPServer().
  3. Найти там отрицательное число, вы должны сделать что-то разумное.

Правильно ли я понял документацию?

1 голос
/ 21 января 2011

Из документации кажется, что вам следует позвонить вашему clientCallbackFunction при возникновении ошибки. Если вы этого не сделаете, вам следует отредактировать вопрос, чтобы уточнить это.

0 голосов
/ 03 февраля 2011

В документации указано, что ConnectToTCPServer вернет код ошибки. Обратный вызов вызывается только в том случае, если соединение установлено, отключено или имеются данные, готовые для чтения.

В сообщении, которое вы получаете, говорится, что ошибка НЕ ​​ФАТАЛЬНАЯ, поэтому она не должна прерываться. Если вы уверены, что код не прерывается позже, это действительно похоже на ошибку в библиотеке.

Я не знаком с CVI, но может быть опция (compile- / runtime-), позволяющая прервать даже при нефатальных ошибках (для целей отладки) Если вы можете воспроизвести это в минимальном примере, вы должны сообщить об этом NI .

0 голосов
/ 21 января 2011

Как правило, вы должны иметь возможность просто проверить возвращаемое значение. Тот факт, что ваше приложение завершает работу, подразумевает, что что-то уже перехватывает ошибку и утверждает (или что-то подобное). Не видя никакого контекста (т.е. кода, демонстрирующего, как вы используете эту функцию), трудно быть более точным.

...