运行 i-Code CNES 批处理脚本进行 Fortran 分析时出错:“无法识别的选项”

问题描述 投票:0回答:1

我正在尝试使用 i-Code CNES 对 Fortran 项目进行静态代码分析。从 4.1.2 版本下载 CLI 工具并尝试运行

icode.bat
脚本后,我遇到以下错误:

Unrecognized option: -
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

我对调试cmd-batch脚本不太熟悉,并且错误消息没有指定有问题的行或选项。批处理脚本来自他们的 GitHub 存储库,可在here获取。


@REM i-Code CNES Startup Script for Windows
@REM
@REM Required ENV vars:
@REM   JAVA_HOME - location of a JDK home dir

@echo off

set ERROR_CODE=0

@REM set local scope for the variables with windows NT shell
@setlocal

set "scriptdir=%~dp0"
if #%scriptdir:~-1%# == #\# set scriptdir=%scriptdir:~0,-1%
set "ICODE_HOME=%scriptdir%"

@REM ==== START VALIDATION ====
@REM *** JAVA EXEC VALIDATION ***

if not "%JAVA_HOME%" == "" goto foundJavaHome

for %%i in (java.exe) do set JAVA_EXEC=%%~$PATH:i

if not "%JAVA_EXEC%" == "" (
  set JAVA_EXEC="%JAVA_EXEC%"
  goto OkJava
)

if not "%JAVA_EXEC%" == "" goto OkJava

echo.
echo ERROR: JAVA_HOME not found in your environment, and no Java
echo        executable present in the PATH.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation, or add "java.exe" to the PATH
echo.
goto error

:foundJavaHome
if EXIST "%JAVA_HOME%\bin\java.exe" goto foundJavaExeFromJavaHome

echo.
echo ERROR: JAVA_HOME exists but does not point to a valid Java home
echo        folder. No "\bin\java.exe" file can be found there.
echo.
goto error

:foundJavaExeFromJavaHome
set JAVA_EXEC="%JAVA_HOME%\bin\java.exe"

:OkJava
goto run


@REM ==== START RUN ====
:run

set PROJECT_HOME=%CD%

@REM remove trailing backslash, see https://groups.google.com/d/msg/sonarqube/wi7u-CyV_tc/3u9UKRmABQAJ
IF %PROJECT_HOME:~-1% == \ SET PROJECT_HOME=%PROJECT_HOME:~0,-1%

%JAVA_EXEC% -Djava.awt.headless=true -XX:-UseGCOverheadLimit -Xms1024M -Xmx1024M -cp %ICODE_HOME%\*;%ICODE_HOME%\plugins\* fr.cnes.icode.application.ICodeApplication %*
if ERRORLEVEL 1 goto error
goto end

:error
set ERROR_CODE=1

@REM ==== END EXECUTION ====

:end
@REM set local scope for the variables with windows NT shell
@endlocal & set ERROR_CODE=%ERROR_CODE%

@REM see http://code-bear.com/bearlog/2007/06/01/getting-the-exit-code-from-a-batch-file-that-is-run-from-a-python-program/
goto exit

:returncode
exit /B %1

:exit
call :returncode %ERROR_CODE%

我尝试过的:

  • 确保
    JAVA_HOME
    设置正确并指向有效的 JDK 安装。
  • 验证
    java.exe
    是否可以从命令行访问并且正在使用正确的版本。
  • 通读批处理脚本以识别任何明显的语法问题,尤其是围绕 JVM 选项的问题。

导致问题的行似乎涉及设置内存和类路径的 JVM 选项:

%JAVA_EXEC% -Djava.awt.headless=true -XX:-UseGCOverheadLimit -Xms1024M -Xmx1024M -cp %ICODE_HOME%\*;%ICODE_HOME%\plugins\* fr.cnes.icode.application.ICodeApplication %*

我怀疑该错误可能与 JVM 选项有关,特别是

-XX:-UseGCOverheadLimit
,但我不确定。

问题:

  1. 在这种情况下如何确定“无法识别的选项”错误的确切原因?
  2. 有没有办法调试 cmd-batch 脚本以查明错误发生的位置?
  3. 有人在批处理脚本中遇到过 i-Code CNES 或 JVM 选项的类似问题并知道如何解决吗?

任何有关故障排除和解决此问题的见解或建议将不胜感激!

java windows batch-file cmd
1个回答
0
投票
  1. 将选中的各个选项一一去掉

  2. 启动批处理时,

    echo
    状态始终为
    on
    ,这意味着逻辑行将在执行时报告给控制台(即已完成变量名称值的替换)。以
    @
    开头的批处理行在执行之前不会被
    echo
    编辑。

命令

echo off
(通常为
@echo off
)将禁用报告。
echo on
(
@echo on
) 将重新启动它。

因此,批次的通常起始行是

@echo off
,这样就不需要更多
@
行。

由于默认模式为

echo on
,因此整个批处理执行都会报告给控制台,但只需切换
echo
状态即可公开批处理的任何部分,因此对于调试而言,

@echo off
.....
@echo on
code line being analysed
code line being analysed
code line being analysed
@echo off
....

允许在控制台上显示要执行的确切指令。

命令行

pause

将停止批处理的执行,以便可以读取报告。然后可以继续该批处理,也可以使用 Control-C

终止该批处理

通常,这就是批处理文件的调试方式。

顺便说一句,命令

set xyz

报告名称以

xyz
开头的环境变量的值,这在调试时可能会用到。

  1. 毫无疑问。

从我在 Oracle 的 Java 命令行选项页面 中读到的内容来看,似乎有一个

-XX:+UseGCOverheadLimit
选项,但没有提及
-XX:-UseGCOverheadLimit
选项,因为
-UseGCOverheadLimit
是默认选项。

我怀疑这可能是您问题的根源。

© www.soinside.com 2019 - 2024. All rights reserved.