Проблема LIB $ SIGNAL с -F- данными в OpenVMS

Я поддерживаю приложение, которое должно работать с операционной системой Alpha OpenVMS (7.3-2) и Itanium OpenVMS (8.4).
Он написан на C ++, версия компилятора 6.5-046 для Alpha и 7.4-004 для IA64.

У меня проблема с LIB $ SIGNAL (). Как только он сигнализирует о фатальном сообщении, программа прерывается.

Сначала код для воспроизведения этого (как сценарий DCL, который генерирует и создает код):

$ create mtst.msg
.TITLE  Message file for MTST
.IDENT  'VERSION 1.1'
.FACILITY MTST,1 /PREFIX=MTST_
.SEVERITY INFORMATIONAL
HELLO       <Hello World> /fao_count=0
.SEVERITY SUCCESS
SUCCESS     <Opdracht succesvol uitgevoerd> /fao_count=0
.SEVERITY WARNING
WHOOPS      <Dit is een waarschuwing: !AZ> /fao_count=1
.SEVERITY ERROR
WHAAA       <Oeioeioei dat was op het randje> /fao_count=0
.SEVERITY   FATAL
AARGH       <Nu is het helemaal mis> /fao_count=0
.END
$!
$ create msgtest.h
#define __NEW_STARLET 1
#include<lib$routines.h>
#include<stsdef.h>

#pragma extern_model globalvalue

extern unsigned long MTST_HELLO;
extern unsigned long MTST_SUCCESS;
extern unsigned long MTST_WHOOPS;
extern unsigned long MTST_WHAAA;
extern unsigned long MTST_AARGH;

#pragma extern_model relaxed_refdef
$!
$ create msgctest.c
#include<msgtest.h>
#include<stdio>
#include<stdlib.h>

int main(void) {
char* msgArgument = "Boe!";
printf ("Test: info message...\n");
LIB$SIGNAL(MTST_HELLO);
printf("\n");

printf ("Test: success message...\n");
LIB$SIGNAL(MTST_SUCCESS);
printf("\n");

printf ("Test:  warning message...\n");
LIB$SIGNAL(MTST_WHOOPS, 1, msgArgument);
printf("\n");

printf ("Test: error message...\n");
LIB$SIGNAL(MTST_WHAAA);
printf("\n");

printf ("Test: fatal message...\n");
LIB$SIGNAL(MTST_AARGH);
printf("\n");

printf ("Einde test!\n");
}
$!
$ create msgtest.cpp
#include<msgtest.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
#include <chfdef.h>
int main(void) {
char* msgArgument = "Boe!";
cout << "Using IOStream:" << endl << "Test: info message..." << endl;
LIB$SIGNAL(MTST_HELLO);
cout << endl << "Test: success message..." << endl;
LIB$SIGNAL(MTST_SUCCESS);
cout << endl << "Test:  warning message..." << endl;
LIB$SIGNAL(MTST_WHOOPS, 1, msgArgument);
cout << endl << "Test: error message..." << endl;
LIB$SIGNAL(MTST_WHAAA);
cout << endl << "Test: fatal message..." << endl;
LIB$SIGNAL(MTST_AARGH);

// Next line is, of course, never displayed...
cout << endl << "Einde test!" << endl;

}
$!
$! Compile the message file
$ message mtst
$!
$! As a reference, build an executable using the C-source. Will always work both on Alpha and Itanium
$ cc/lis=[] /include=[] msgctest.c /warn=(disa=dollarid)/notrace
$ link msgctest,mtst  /map=[]/cross/notrace
$!
$! Now build the C++ based exe.
$ cxx/lis=[]/reposi=[] /include=[] msgtest.cpp /warn=(disa=dollarid)/notrace/standard=strict_ansi
$! Using this compile statement it works on Itanium:
$! cxx/lis=[]/reposi=[] /include=[] msgtest.cpp /warn=(disa=dollarid)/notrace
$! Using this compile statement it fails again:
$! cxx/lis=[]/reposi=[] /include=[] msgtest.cpp /warn=(disa=dollarid)/notrace/define=(__USE_STD_IOSTREAM)
$ cxxlink msgtest,mtst /map=[]/cross/notrace
$!

C-источник всегда работает и на Альфе работают оба скрипта.

При компиляции без / STANDARD это хорошо работает на Itanium, но в оригинальной программе у меня были проблемы с использованием iostream: мне нужен ANSI, но компиляция с / DEFINE = (__ USE_STD_IOSTREAM) вернула исходную проблему.

$r msgtest
Test: info message...
%MTST-I-HELLO, Hello World

Test: success message...
%MTST-S-SUCCESS, Opdracht succesvol uitgevoerd

Test: inwarningfo message...
%MTST-W-WHOOPS, Dit is een waarschuwing: Boe!

Test: error message...
%MTST-E-WHAAA, Oeioeioei dat was op het randje

Test: fatal message...
%CXXL-F-TERMINATING, terminate() or unexpected() called
$

Я ожидаю, что это:

$ r msgctest
Test: info message...
%MTST-I-HELLO, Hello World

Test: success message...
%MTST-S-SUCCESS, Opdracht succesvol uitgevoerd

Test:  warning message...
%MTST-W-WHOOPS, Dit is een waarschuwing: Boe!

Test: error message...
%MTST-E-WHAAA, Oeioeioei dat was op het randje

Test: fatal message...
%MTST-F-AARGH, Nu is het helemaal mis
$

Итак …% CPP -? — WTF, помогите пожалуйста: — /

Заранее спасибо,
Оскар

Примечание: в оригинальном посте, который я сделал вчера, был другой скрипт с еще одним тестовым кодом, например, try / catch. Конечно, это изменило результат теста, как указано в его комментарии user2116290.
Я изменил сценарий DCL на исходный тест, чтобы воспроизвести то, что я вижу в исходном приложении.

3

Решение

Пока я не вижу проблемы.

$ sh symb x
X = 134316076   Hex = 0801802C  Octal = 01000300054
$ search *.lis 0801802C/noheader
0801802C    13 AARGH       <Nu is het helemaal mis>

На Alpha (я пробовал это с HP C ++ V7.1-015 для OpenVMS Alpha V8.3), вы ловите свой код ошибки. Затем вы вызываете abort (), который сигнализирует 0x434, OPCCUS, который выглядит хорошо для меня.

На Alpha, если я удаляю try / catch c ++ — программа ведет себя как c-программа. У меня нет доступа к I64 с c ++, поэтому я не могу дважды проверить, каким будет результат прерывания abort () на I64. Это может быть просто% CXXL-F-TERMINATING.

Новое обновление:

Похоже, что сочетание строгого режима ANSI и стандартных iostreams запускает обработчик C ++ catch all, который перехватывает фатальное условие / исключение VMS. В вашем примере кажется возможным отключить перехват условий VMS с помощью:

$ diff -ub old.cpp new.cpp
--- old.cpp     2015-11-11 19:42:52 +0100
+++ new.cpp     2015-11-11 19:49:10 +0100
@@ -1,8 +1,14 @@
#include<msgtest.h>
#include<iostream>
#include<stdlib.h>
+#ifdef __ia64
+#include<cxx_exception.h>
+#endif
using namespace std;
int main(void) {
+#ifdef __ia64
+    cxxl$set_condition(pure_unix);
+#endif
char* msgArgument = "Boe!";
cout << "Using IOStream:" << endl << "Test: info message..." << endl;
LIB$SIGNAL(MTST_HELLO);

Компиляция, компоновка и запуск измененного примера:

    $ cxx /standard=strict_ansi/lis/warn=(disa=dollarid)/notrace/incl=[]/repo=[] new.cpp
$ link /map=new/full=demangled/cross/notrace new, mtst
$ r new
Using IOStream:
Test: info message...
%MTST-I-HELLO, Hello World

Test: success message...
%MTST-S-SUCCESS, Opdracht succesvol uitgevoerd

Test:  warning message...
%MTST-W-WHOOPS, Dit is een waarschuwing: Boe!

Test: error message...
%MTST-E-WHAAA, Oeioeioei dat was op het randje

Test: fatal message...
%MTST-F-AARGH, Nu is het helemaal mis
$

Может быть, это работает и для вас.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]