我有一个简单的COBOL 程序 (在Visual for Eclipse 项目中),它计算二进制间隙的最大大小并打印结果。现在,我希望创建一个单元测试,然后修改程序,以便将结果返回到测试框架。
单独目录中有一个单元测试项目。在Eclipse中,项目结构如下所示:

这是自动生成单元测试的代码。
当我在Eclipse中运行它时,我首先得到一条Windows错误消息
启动应用程序时出错(0xc0000142)。若要退出应用程序,请按“确定”。


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

每次运行后,都会在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: i将注册表项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: I更改了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发布于 2018-08-15 08:04:02
首先,我的免责声明,我不是Cobol程序员。
另一方面,引起我注意的是你得到的窗户例外。我的猜测是,这更像是Windows错误,而不是Eclipse/Cobol one。这是一个古老的Windows错误,可能已经存在了30年左右。
您忘记提到正在使用的窗口(xp/vista/7/8/10,x86/x64)以及您有多少内存。
错误:
启动应用程序时出错(0xc0000142)。若要退出应用程序,请按“确定”。
已经和窗户在一起很久了。
什么意思?引用MSDN:
STATUS_DLL_INIT_FAILED,翻译为:
{DLL初始化失败}动态链接库%hs的初始化失败。这一过程正在异常终止。
换句话说,您正在使用未注册或以某种方式过期的dll。通常,如果您的系统以其他方式工作,则有以下原因:
一种猜测是你不知何故耗尽了你的桌面堆。您也可能会遇到桌面堆安全性问题(在用户之间移动时),但是对于您的描述,我认为这是第一个。
一种可能是您尝试加载不适合于任何空闲内存空间(这是分段的)的大型.dll库。修复它的唯一方法是在此之前分配这个空间,然后将其释放给.dll。
要记住的事情:
监视进程堆的一种方法是使用sysinternals:VMMap
增加内存堆(在Windowsx32/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
-Xmx2056mhttps://stackoverflow.com/questions/51752408
复制相似问题