Uploaded image for project: 'Commons Daemon'
  1. Commons Daemon
  2. DAEMON-398

Java 11 jvm.dll startup messages not available on stdout/stderr using Windows 10/2016

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Reopened
    • Major
    • Resolution: Unresolved
    • 1.1.1
    • None
    • Procrun
    • None
    • Windows

    Description

      Steps to reproduce

      1. Install Java 11
      2. Install prunsrv.exe using jvm.dll and specify stdout and stderr file.
      3. Using prunmgr, add a Java Option '-invalid'
      4. Start the service
      5. stdout and stderr files are empty!
      6. Install Java 10
      7. Using prunmgr, switch the Java Virtual Machine to Java 10
      8. Start the service
      9. stderr
        Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
        Unrecognized option: -invalid
        

      Analysis

      • It works for Java 8, 9 and 10, fails for 11, 12 and 13-ea.
      • I followed this guide: Redirecting standard I/O from within a program (see set-stdout.patch), but it didn't help.
      • Even when I compile prunsrv with Visual Studio 2017 15.9 (linker 14.16) and test with Java 13-ea, which is also compiled with the same version (hence using the same C-runtime library) it does not work.
      • The guide ends with what the probably causing the issue:

        ... the one problem that remains with redirecting Win32 file handles:
        It doesn't affect anything in the program using a different C runtime library (such as a third-party DLL, for example).

      • Setting registry value Log/LogJniMessages=1, which is using the vfprintf option of the JNI_CreateJavaVM does not help. Maybe because is is added after the user-specified Java Options?

      Ideas

      1. Make vfprintf the first parameter
        Downside of vfprintf is that it is hard to distinct between stdout and stderr. Maybe make a JNI call to System.out and System.err to be able to recognize the *File pointer and map to stdout and stderr accordingly.
        And I think that javajni.c/apxJavaSetOut() should not be required.
      2. Log a bug for OpenJDK and try to get it fixed.
      OS Daemon version (built with) Java vendor and version (built with) Result
      Windows 7 1.1.x HEAD (9.00) AdoptOpenJDK 11.0.3+7 (14.15) OK
      Windows 2008R2  1.1.x HEAD (9.00)  AdoptOpenJDK 11.0.3+7 (14.15) OK
      Windows 2012R2 1.1.x HEAD (9.00)  AdoptOpenJDK 11.0.3+7 (14.15) OK
      Windows 2016  1.1.x HEAD (9.00)  AdoptOpenJDK 11.0.2+9 (12.00) OK
      Windows 2016  1.1.x HEAD (9.00)  AdoptOpenJDK 11.0.3+7 (14.15) Fail

      Note: It is assumed the OS is fully patched unless otherwise stated.

      Attachments

        1. set-stdout.patch
          3 kB
          Gerwin

        Issue Links

          Activity

            People

              Unassigned Unassigned
              gerwin84 Gerwin
              Votes:
              1 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

                Created:
                Updated: