@echo OFF REM This is a MSFT Windows version of the CAVE capture script. REM This script will identify any running CAVE processes (cave.exe) REM and use Java to generate jstacks and (optionally) heap dumps REM for the process(es). All of the files generated by this capture REM script and any associated CAVE logs will be placed in a directory REM in the user's 'My Documents' directory. REM Usage: capture.bat [-d][-h] REM Verify that the location of the Java JDK is known. IF "%JAVA_JDK%" == "" ( echo ERROR: Unable to determine the location of the Java JDK. Use the JAVA_JDK Env Variable to set the location. GOTO EOF ) SET heap_dump=0 REM Process and validate any command line parameters, displaying usage REM information if necessary. IF "%1" == "" GOTO run REM Verify that there is only one argument. IF NOT "%2" == "" GOTO usage REM Check for the -d argument. IF "%1" == "-d" ( SET heap_dump=1 GOTO run ) REM Either an invalid argument or the -h argument. GOTO usage :usage echo Usage: %0 [-d][-h] echo -d: Enables the heap dump capture echo -h: Displays the usage message GOTO EOF :run SET jstack_iterations=15 SET PROCESS=cave.exe REM Prepare Environment SET Path=%JAVA_JDK%\bin;%Path% REM Build a date/time string to use in the name for the capture directory. SET RND=%random% SET RND_DATETIME_FILE=%TMP%\awips2dt_%RND%.tmp REM Python is used to retrieve the current date and time because the order REM of the Windows date/time fields is not necessarily guaranteed and the REM Windows date/time fields can only be extracted using substring operations REM instead of -formatter- strings like Linux allows. python -c "from datetime import datetime; print datetime.now().strftime('%%Y%%m%%d_%%H%%M%%S');" > %RND_DATETIME_FILE% SET /p CAPTURE_DATETIME= < %RND_DATETIME_FILE% DEL %RND_DATETIME_FILE% SET CAPTURE_DIRECTORY=%userprofile%\capture_%CAPTURE_DATETIME% SET CAVEDATA_LOGS_DIRECTORY=%userprofile%\%logdir% SET CAPTURE_LOG=%CAPTURE_DIRECTORY%\capture_info.log REM Get the PID of any currently running CAVE process. for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq %PROCESS%" /fo csv') do call :process_pid %%~F GOTO prepare_exit :process_pid IF NOT EXIST "%CAPTURE_DIRECTORY%" (MKDIR "%CAPTURE_DIRECTORY%") SET process_pid=%1 SET jstack_counter=0 echo Found %PROCESS% with pid %process_pid% ... echo Found %PROCESS% with pid %process_pid% ... >> %CAPTURE_LOG% :while_jstack if %jstack_counter% lss %jstack_iterations% ( set /a jstack_counter+=1 echo Completing jstack iteration %jstack_counter% ... echo Completing jstack iteration %jstack_counter% ... >> %CAPTURE_LOG% SET jstack_log=%CAPTURE_DIRECTORY%\pid_%process_pid%_jstack_%jstack_counter%.log jstack -l %process_pid% >> "%jstack_log%" echo Running command: jstack -l %process_pid% >> %CAPTURE_LOG% IF ERRORLEVEL 1 ( echo jstack for pid %process_pid% failed to connect, rerunning with -F >> %CAPTURE_LOG% echo jstack for pid %process_pid% failed to connect, rerunning with -F echo Running command: jstack -l -F %process_pid% >> %CAPTURE_LOG% jstack -l -F %process_pid% >> "%jstack_log%" ) goto :while_jstack ) REM Copy the CAVE logs for the pid to the capture directory. echo Running command: xcopy "%CAVEDATA_LOGS_DIRECTORY%\*pid_%process_pid%*.log" "%CAPTURE_DIRECTORY%" >> %CAPTURE_LOG% xcopy "%CAVEDATA_LOGS_DIRECTORY%\*pid_%process_pid%*.log" "%CAPTURE_DIRECTORY%" >> %CAPTURE_LOG% IF ERRORLEVEL 0 GOTO check_heap echo Failed to copy the CAVE logs files. echo Failed to copy the CAVE logs files. >> %CAPTURE_LOG% :check_heap REM Create a heap dump if the option has been enabled. IF %heap_dump% NEQ 1 ( echo Heap dumps have been disabled. >> %CAPTURE_LOG% exit /b ) SET heap_path=%CAPTURE_DIRECTORY%\pid_%process_pid%_heap.hprof SET dump_path=%CAPTURE_DIRECTORY%\pid_%process_pid%_dump.txt echo Running command: jmap -heap %process_pid% >> %CAPTURE_LOG% jmap -heap %process_pid% > %heap_path% echo Running command: jmap -dump:live,format=b,file=%dump_path% %process_pid% >> %CAPTURE_LOG% jmap -dump:live,format=b,file=%dump_path% %process_pid% IF ERRORLEVEL 1 ( echo jmap for pid %process_pid% failed to connect, rerunning with -F >> %CAPTURE_LOG% echo jmap for pid %process_pid% failed to connect, rerunning with -F echo Running command: jmap -dump:live,format=b,file=%dump_path% -F %process_pid% >> %CAPTURE_LOG% jmap -dump:live,format=b,file=%dump_path% -F %process_pid% ) REM end of process_pid sub-routine exit /b :prepare_exit IF NOT EXIST %CAPTURE_DIRECTORY% (GOTO EOF) echo Capture data is available in %CAPTURE_DIRECTORY% ... start "" "%CAPTURE_DIRECTORY%" PAUSE :EOF