3

我有一组单线程 C++ 主程序,它们的大部分代码都是用 Ada 开发的。这是在 Atego (Rational) Apex Duo 中构建的,目标是 32 位 RHEL 6.3 Linux。exec 是我开发的一个类系统,它包括套接字、状态机和一个计时器类,它是 exec 的核心。类系统用于在通过套接字通信的 6 个不同系统上构建和执行 14 个单独的 exec。它们都使用相同的 Class 系统,并在启动时基于 INI 文件进行配置。

执行人员通过 gettimeofday 使用 linux 系统时钟以 50 或 60 Hz 的频率帧

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

和一个简单的非忙等待算法来生成所需的调度程序。

我目前面临的问题是这些高管(看似)随机失败。失败似乎是他们只是停止了取景。我已经将所有运行时 C++ 过程封装在“try{} catch(...){}”中,并且没有捕获任何内容。同样,Ada 例程受到不会被命中的异常处理程序的保护。

exec 通常会在失败前愉快地运行 30 分钟到一个多小时。没有明显的内存蠕变迹象(使用系统监视器)。我已将 Atego Rational 图形调试器附加到已经运行的执行程序上,但无济于事。当一个最终失败时,调用堆栈中没有任何内容,调试器日志中的唯一指示是应用程序“退出,状态为 255”。

恐怕系统中某处的(Linux)系统例程或驱动程序正在调用 Exit。似乎有些东西正在调用退出!

任何人都知道如何进一步解决这个问题?

4

3 回答 3

2

这可能不应该是一个答案,但它的评论范围太广了......

因此,故障出现在 6 台机器上的单个可执行文件中;负责通过网络共享数据的可执行文件;正确的?并且“本地”可执行文件似乎是可靠的......或者 6 个有故障的可执行文件没有如此干净地映射到 6 个系统上?

故障是否与网络负载有关,例如延迟超过您的(电视或交流电源)帧速率?通过阻塞网络使其更快地失败可以简化测试......

当 Linux 网络时钟向后运行时,我的系统出现故障......故障发生在 C++ 组件中,因此当 dt 变为负数时不会出现简单的约束错误,但是离故障很远的一个荒谬的“4e9 微秒超时”.. .

听起来 Ada 的任务工具和分布式系统附件对于这个应用程序来说是理想的,但这种级别的设计更改在现阶段可能不合适。

于 2013-03-24T15:19:19.277 回答
0

也许它可以给你一些进一步的方向:

如果您尝试从 main 返回 double 这可能会发生。看:

double main ()
{
    return 0.0;
}
$ cc double.c
double.c:在函数'main'中:
double.c:2:警告:'main' 的返回类型不是 'int'
$ ./a.out
$回声$?
255
$

如果在 POSIX 操作系统下尝试从 main() 返回 double,则调用进程几乎总是会看到 255。

于 2013-03-23T02:58:30.307 回答
0

现在看来,Ada RTS 对 C++ main 并不“满意”。当然不是所有的都回答了......但固定工作。我们从 C++ 电源更改为 Ada 电源……这是一个简单的更改……Ada 现在导入了一堆 C++,而不是相反。它不像 C++ 主程序那样原始……但我猜它的功能非常好。

悬而未决的问题是它为什么一开始就死了?......为什么只有一些高管......而其他人继续“永远”运行?我们怀疑它最终与越界有关,并且应用程序在调用 Ada 中的例程时必须做的越多……它死得越快。这让我们相信堆栈被破坏了......但为什么只有 C++ 主?

无论如何,它适用于 Ada 电源,并且工作是最重要的要求……所以我们称之为“固定”。

于 2013-03-30T13:14:45.673 回答