3

我正在使用库 Function ConnectToTCPServer。当主机不可达时,该函数超时。在这种情况下,应用程序崩溃并出现以下错误:“NON-FATAL RUN-TIME ERROR: "MyClient.c", line 93, col 15, thread id 0x000017F0: Library function error (return value == -11 [0xfffffff5]) . 超时错误"

Errorcode 11 是一个超时错误,所以这可能在我的应用程序中经常发生 - 但是应用程序崩溃 - 我想捕捉这个错误而不是让我的应用程序崩溃。

如何在 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;
}

回调函数永远不会被调用。我的服务器没有运行,所以 ConnectToTCPServer 将超时。我会怀疑回调被调用 - 但它从未被调用。

编辑2:实际上没有调用回调函数,ConnectToTCPServer的返回值包含相同的错误信息。我认为ConnectToTCPServer抛出此错误可能是一个错误。我只需要抓住它并将其放入 C90 中即可。有任何想法吗?

编辑 3:我测试了回调函数,在我的服务器在线的罕见情况下,实际调用了回调函数 - 这无济于事,因为发生错误时不会调用回调。

4

6 回答 6

3

Looking in NI documentation, I see this:
"Library error breakpoints -- You can set an option to break program execution whenever a LabWindows/CVI library function returns an error during run time. "

I would speculate they have a debug option to cause the program to stop on run-time errors, which you need to disable in configuration, in compile time or in run-time.

My first guess would have been configuration value or compilation flag, but this is the only option I found, which is a run-time option:
// 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();

Say if it helped.

于 2011-02-03T20:53:57.707 回答
2

在标准 C 中没有“捕获”错误(或“异常”)的一般情况。这取决于您的库来决定如何处理它。很可能它记录了它的状态,然后简单地调用 abort()。在 Unix 中,该信号SIGABRT可以被处理,而不仅仅是 exit()ed。或者他们的库可能只是在记录,然后调用 exit()。

您可以在一个实用程序下运行您的应用程序,例如查看正在strace执行哪些系统调用以及正在断言哪些信号。

如果您无法取得任何进展,我会与您的供应商合作。

于 2011-01-27T23:27:21.450 回答
1

我不确定我是否理解你。

我查看了库函数的文档ConnectToTCPServer()。它返回一个整数;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. 在那里找到一个负数,你应该做一些明智的事情。

我是否正确理解了文档?

于 2011-01-30T00:22:09.170 回答
1

clientCallbackFunction从文档中,您似乎应该在发生错误时接到您的电话。如果你不这样做,你应该编辑你的问题以澄清这一点。

于 2011-01-21T11:13:43.730 回答
0

通常,您应该能够简单地检查返回值。您的应用程序退出的事实意味着某些东西已经在捕获错误并断言(或类似的东西)。没有看到任何上下文(即演示您如何使用此功能的代码),很难更精确。

于 2011-01-21T10:45:15.870 回答
0

文档说明ConnectToTCPServer将返回错误代码。只有在建立连接、断开连接或有数据可供读取时才会调用回调。

您收到的消息表明错误是非致命的,因此它不应该中止。如果您确定代码以后不会中止,那么它似乎确实是库中的一个错误。

我不熟悉 CVI,但可能有一个 (compile-/runtime-) 选项可以中止,即使是非致命错误(用于调试目的)。如果你能在一个最小的例子中重现这个,你应该把它报告给 NI

于 2011-02-03T10:28:38.020 回答