我正在尝试使用 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 选项:
%JAVA_EXEC% -Djava.awt.headless=true -XX:-UseGCOverheadLimit -Xms1024M -Xmx1024M -cp %ICODE_HOME%\*;%ICODE_HOME%\plugins\* fr.cnes.icode.application.ICodeApplication %*
我怀疑该错误可能与 JVM 选项有关,特别是
-XX:-UseGCOverheadLimit
,但我不确定。
任何有关故障排除和解决此问题的见解或建议将不胜感激!
将选中的各个选项一一去掉
启动批处理时,
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
开头的环境变量的值,这在调试时可能会用到。
从我在 Oracle 的 Java 命令行选项页面 中读到的内容来看,似乎有一个
-XX:+UseGCOverheadLimit
选项,但没有提及 -XX:-UseGCOverheadLimit
选项,因为 -UseGCOverheadLimit
是默认选项。
我怀疑这可能是您问题的根源。