我在維護一個必須運行op Alpha OpenVMS(7.3-2)和Itanium OpenVMS(8.4)的應用程序。 它用C++編寫,編譯器版本爲Alpha上的6.5-046和IA64上的7.4-004。
我遇到的問題是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 - - 跆拳道,幫助請: -/
由於提前, 奧斯卡
注意:在我昨天發佈的原始文章中,有一個不同的腳本,其中包含更多測試代碼,如try/catch。當然這會改變testresult,正如user2116290在他/她的評論中所述。 我將DCL腳本更改爲原始測試,以重現我在原始應用程序中看到的內容。
恐怕你是對的;我添加了try/catch來查看拋出的內容,這確實是預期的代碼。這會導致Alpha版本失敗。刪除try/catch使得它現在可以在Alpha和IA64上正常工作,所以我需要追溯昨天我在做什麼,以便在我的測試腳本中重現它。我會在這裏重新發布 – Oscar
好吧,我的原始問題是使用工作腳本進行更新以重現此問題,並且說明/結果已更新。至少,你解釋了爲什麼我無法重現正在運行的Alpha版本......在這一問題的一天挖掘之後完全忽略了它......感謝! – Oscar
也許有人用C++訪問I64系統可以給出一些見解。如果沒有,我會考慮向惠普詢問這種不兼容性。他們應該能夠解釋兩種平臺上的不同行爲和/或strict_ansi標準的影響。我可以考慮採用VMS條件(異常)處理程序的解決方法/破解方法,但當惠普知道/解決此「功能」問題時可能不值得。 PS:你可能在Alpha和I64上使用相同的構建命令,但是你確實只需要在Alpha上使用cxxlink。 – user2116290