jfr.dcmd log is not shown

Erik Gahlin erik.gahlin at oracle.com
Tue Oct 23 15:17:09 UTC 2018


Hi Yasumasa, 

Please file a bug. Markus and I will not have time to look at this week (CodeOne), but I will check it out next week. Ping me if I forget.

Thanks
Erik


> On 23 Oct 2018, at 08:10, Yasumasa Suenaga <yasuenag at gmail.com> wrote:
> 
> Hi all,
> 
> I tried to check arguments of -XX:StartFlightRecording via -Xlog:jfr+dcmd=debug , but I couldn't.
> 
> jfr.dcmd log will be shown from DCmdStart::execute, but I think it has two problems:
> 
>  1. Log level will be not set before showing log.
>     LogTag::tagSetLevel is used to decide to show the log. But it will be set in
>     JNI code which is called by JVM::<clinit>. JVM class is not loaded when
>     DCmdStart::execute tries to show log.
> 
>  2. `settings` might be null, so NPE will occur when DCmdStart::execute tries to
>     show log.
> 
> IMHO they can be fixed with following patch. Can I file this problem to JBS and send a webrev?
> (I'm a Committer of jdk project)
> 
> 
> ---------------------
> diff -r eadd0abbfdf4 src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdStart.java
> --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdStart.java    Tue Oct 23 13:24:36 2018 +0200
> +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdStart.java    Wed Oct 24 00:10:05 2018 +0900
> @@ -34,6 +34,7 @@
> import java.util.Arrays;
> import java.util.HashMap;
> import java.util.Map;
> +import java.util.Objects;
> 
> import jdk.jfr.FlightRecorder;
> import jdk.jfr.Recording;
> @@ -81,9 +82,12 @@
>      */
>     @SuppressWarnings("resource")
>     public String execute(String name, String[] settings, Long delay, Long duration, Boolean disk, String path, Long maxAge, Long maxSize, Boolean dumpOnExit, Boolean pathToGcRoots) throws DCmdException {
> +        if (!JVM.getJVM().isAvailable()) {
> +            throw new DCmdException("JFR is not available");
> +        }
>         if (LogTag.JFR_DCMD.shouldLog(LogLevel.DEBUG)) {
>             Logger.log(LogTag.JFR_DCMD, LogLevel.DEBUG, "Executing DCmdStart: name=" + name +
> -                    ", settings=" + Arrays.asList(settings) +
> +                    ", settings=" + Arrays.asList(Objects.requireNonNullElse(settings, new String[0])) +
>                     ", delay=" + delay +
>                     ", duration=" + duration +
>                     ", disk=" + disk+
> ---------------------
> 
> 
> Thanks,
> 
> Yasumasa



More information about the hotspot-jfr-dev mailing list