0

我有一个简单的 COBOL程序(在 Visual Cobol for Eclipse项目中),它计算二进制间隙的最大大小并打印结果。现在我想创建一个单元测试,然后修改程序,以便将结果返回给测试框架。

在单独的目录中有一个单元测试项目。在 Eclipse 中,项目结构如下所示:

截屏

是自动生成的单元测试的代码。

当我在 Eclipse 中运行它时,我首先收到一条 Windows 错误消息

启动应用程序时出错 (0xc0000142)。要退出应用程序,请按 OK。

截屏

截屏

此后测试被标记为“已跳过”:

截屏

每次运行后都会创建一个文件COBOL-3\New_Configuration.bin,例如5872mfunit-state.dat. 它包含以下错误消息:

截屏

文件COBOL-3\New_Configuration.bin\MFUT_TESTBINARYGAP-syserr.txt为空。COBOL-3\New_Configuration.bin\MFUT_TESTBINARYGAP-sysout.txt包含我的程序的输出(如预期的那样):

BIN-REP
00000100000000000000000000000000
CTR
06
CTR:
06
CTR:
05
CTR:
04
CTR:
03
CTR:
02
CTR:
01
MAX-GAP-SIZE:
00

文件COBOL-3\New_Configuration.bin\COBOL-TEST.mfu包含

[global]
fixture-filename=COBOL-TEST
preferred-cwd=C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\New_Configuration.bin
preferred-runner=mfurun
preferred-64bit-runner=true
isolate=true
report=noprintfile
report=nomarkdown
ignore-return-code=false
exit-code=true
cleanup=false

[MFUT_TESTBINARYGAP]
source.filename=C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\TestBinaryGap.cbl
source.lineno=17
source.seqfilename=C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\TestBinaryGap.cbl
source.seqno=172
collection.info=COBOL-TEST
setup=true

文件COBOL-3\New_Configuration.bin\TestBinaryGap.obj.1.tlog包含:

#"C:\PROGRA~2\Micro Focus\Visual COBOL\bin64\cobol.exe" C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\TestBinaryGap.cbl DELINT USEC:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\New_Configuration.bin\mfant1904268475359773097.dir ;
^C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\TestBinaryGap.cbl
!C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\mfunit_prototypes.cpy
?C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\mfunit_prototypes.cpy
!$COBCPY\mfunit_prototypes.cpy
+"C:\Program Files (x86)\Micro Focus\Visual COBOL\cpylib\mfunit_prototypes.cpy"
!C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\mfunit.cpy
?C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\mfunit.cpy
!$COBCPY\mfunit.cpy
+"C:\Program Files (x86)\Micro Focus\Visual COBOL\cpylib\mfunit.cpy"
-"C:\Program Files (x86)\Micro Focus\Visual COBOL\cpylib\mfunit.cpy"
-"C:\Program Files (x86)\Micro Focus\Visual COBOL\cpylib\mfunit_prototypes.cpy"
!C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\mfunit.cpy
?C:\usr\dp\dev\java-mainframe\01-BinaryGap\COBOL-3\mfunit.cpy
!$COBCPY\mfunit.cpy
+"C:\Program Files (x86)\Micro Focus\Visual COBOL\cpylib\mfunit.cpy"

我怎样才能解决这个问题?

目标是创建一个最小测试(可能通过或失败,但不会像现在那样崩溃),然后逐渐向它添加逻辑(它必须是循序渐进的,因为我对 COBOL 不是很有经验)。

更新 1:我将注册表项的值HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\Windows

%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16

%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,1024 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16

错误仍然存​​在。

更新 2:有关系统的信息。

截屏

更新 3:运行测试前的 VMMAP 输出:

之前的截图

出现错误信息后:

之后的截图

更新 4: JVM 版本似乎是 1.8。

截屏

更新 5:我更改了eclipse.ini文件中的内存设置,使其看起来像这样:

-startup
plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.551.v20171108-1834
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
-name
Visual COBOL
-feature
com.microfocus.eclipse.core.product
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.8
-XX:+UseG1GC
-XX:+UseStringDeduplication
-Xms1024m
-Xmx2056m
-Dosgi.splashPath=platform:/base/plugins/com.microfocus.eclipse.core.win32
--add-modules=ALL-SYSTEM
--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED
-XX:+IgnoreUnrecognizedVMOptions
-DDSTORE_REMOTE_CLASS_LOADING_ON=true
-Denable.analysis=true
4

1 回答 1

1

首先我的免责声明,我不是 Cobol 程序员。

另一方面,引起我注意的是你得到的 windows 异常。我的猜测是,这比 Eclipse/Cobol 更多的是 Windows 错误。这是一个古老的 Windows 错误,可能已经存在了 30 年左右。

您忘记提及您正在使用哪些窗口(xp/vista/7/8/10、x86/x64)以及您拥有多少内存。

错误:

启动应用程序时出错 (0xc0000142)。要退出应用程序,请按 OK。

已经使用 windows 多年了。

这是什么意思?引用 MSDN:

STATUS_DLL_INIT_FAILED翻译为:

{DLL Initialization Failed} 动态链接库 %hs 的初始化失败。进程异常终止。

换句话说,您使用的是未注册或以某种方式过期的 dll。通常,如果您的系统正常工作,有以下原因:

  1. 一次运行多个应用程序(耗尽)
  2. 在不同的桌面上运行应用程序(安全性)
  3. 以不同用户身份运行应用程序(安全性)

一种猜测是您以某种方式耗尽了桌面堆。您也可能遇到桌面堆安全问题(在用户之间移动时),但根据您的描述,我认为这是第一个。

一种可能性是您尝试加载不适合任何可用内存空间(碎片化)的巨大 .dll 库。修复它的唯一方法是先分配此空间,然后将其释放给 .dll。

要记住的事情:

  1. 服务的桌面堆比普通(交互式)桌面小
  2. RDP 会话上的桌面堆更小
  3. x64 系统增加了桌面堆(这就是我想知道您的系统是什么的原因)。

监视进程堆的一种方法是使用 sysinternals:VMMap

增加内存堆(在 Windows x32/x64 上)。打开regedit

然后转到:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems

然后打开最后一把Windows钥匙。你应该找到SharedSection=a,b,c. 忽略a(不需要)。

b是:

SharedSection 注册表项的第二个值是与交互式窗口站关联的每个桌面的桌面堆大小。在交互式窗口站 (WinSta0) 中创建的每个桌面都需要堆。该值以千字节 (KB) 为单位。

c是:

第三个 SharedSection 值是与“非交互式”窗口站关联的每个桌面的桌面堆大小。该值以千字节 (KB) 为单位。

对于32 位操作系统,将b值增加到12288;将c值增加到1024

对于64 位操作系统,将b值增加到20480;将c值增加到1024

(不要超过建议的值,它可能会使您的系统行为不可预测)

对于系统,您的部分应如下所示x64

SharedSection=1024,20480,1024

尝试更改值,我想知道您是否再次收到错误。

编辑在我看来,这个问题可能隐藏在 Eclipse 本身中,并对 env 施加了堆限制:

在你eclipse.ini请改变价值观

这些可能是原始值:

-Xms256m
-Xmx512m

-Xms : 初始起始堆大小

-Xmx : 最大堆大小

试试这些新的:

 -Xms1024m
 -Xmx2056m
于 2018-08-15T08:04:02.007 回答