程序退出状态为255 C ++ Main with Ada

时间:2013-03-23 02:39:58

标签: c++ linux exit ada

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

执行者使用linux系统时钟通过gettimeofday以50或60 Hz的频率进行框架

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

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

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

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

我担心系统中的某个(Linux)系统例程或驱动程序正在调用Exit。很明显,SOMETHING正在呼叫退出!

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

3 个答案:

答案 0 :(得分:2)

这可能不是一个答案,但它的评论范围太宽......

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

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

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

听起来好像Ada的任务设施和分布式系统附件对于这个应用来说是理想的,但是在这个阶段,这种设计变化水平可能不合适。

答案 1 :(得分:0)

也许它可以给你一些进一步的指导:

如果你尝试从main返回double,可能会发生这种情况。 见:

double main ()
{
    return 0.0;
}
$ cc double.c
double.c: In function 'main':
double.c:2: warning: return type of 'main' is not 'int'
$ ./a.out
$ echo $?
255
$

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

答案 2 :(得分:0)

现在看来,Ada RTS对C ++ main并不“满意”。当然不是所有人都得到了答案......但是固定工作。我们从C ++主电源改为Ada电源......这是一个简单的改变...... Ada现在导入一堆C ++而不是相反。它并不像C ++主要原始那样纯净......但我觉得功能性非常好。

未解决的问题是为什么它首先死了?...为什么只有一些高管......而其他人继续“永远”奔跑?我们怀疑它最终会与超出界限的事情有关,并且应用程序在调用Ada中的例程时必须做的越多......它死得越快。这让我们相信堆栈已被破坏......但为什么只有C ++主要?

无论如何,它适用于Ada主电源,工作是最重要的要求......因此我们将其称为“固定”。