PING: RFR: 8209790: SA tools not providing option to connect to debug server

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Sun Jun 16 21:47:33 UTC 2019


Forgot to tell...
This can be pushed only after the CSR is approved.

Thanks,
Serguei


On 6/16/19 14:44, serguei.spitsyn at oracle.com wrote:
> Hi Yasumasa,
>
>
> On 6/16/19 07:22, Yasumasa Suenaga wrote:
>> Hi Serguei,
>>
>> >>> One minor suggestion is to use the final field NO_REMOTE instead
>> >>> of null for initialization of the local variable "remote".
>>
>> I fixed it on new webrev. Could you check again?
>>   http://cr.openjdk.java.net/~ysuenaga/JDK-8209790/webrev.02/
>
>
> It looks good.
> Thanks you for the update!
>
>>
>> >> IMHO refactoring should be worked on another issue.
>> >
>> > Agreed.
>>
>> I filed it to JBS:
>>   https://bugs.openjdk.java.net/browse/JDK-8226204
>
> Thank you for filing the enhancement!
>
> Thanks.
> Serguei
>
>
>> Thanks,
>>
>> Yasumasa
>>
>>
>> On 2019/06/15 15:10, serguei.spitsyn at oracle.com wrote:
>>> Hi Yasumasa,
>>>
>>>
>>> On 6/14/19 21:11, Yasumasa Suenaga wrote:
>>>> Hi Serguei,
>>>>
>>>> Thank you for your comment!
>>>>
>>>> On 2019/06/15 8:00, serguei.spitsyn at oracle.com wrote:
>>>>> Hi Yasumasa,
>>>>>
>>>>> I've added myself as a reviewer, so you can finalize it now.
>>>>
>>>> I moved CSR to Finalized, and added a comment for your question.
>>>
>>> Okay, thanks!
>>>
>>>
>>>>> The fix looks pretty good to me.
>>>>>
>>>>> One minor suggestion is to use the final field NO_REMOTE instead
>>>>> of null for initialization of the local variable "remote".
>>>>
>>>> I will fix that.
>>>>
>>>>
>>>>> Also just an observation that there is some room for option 
>>>>> processing refactoring.
>>>>
>>>> Your suggestion handles all options in one parser method.
>>>> I concern it might be complex for option validation.
>>>> (e.g. `jmap -heap` is allowed, but `jstack -heap` is not allowed.)
>>>
>>> This concern is not valid as the list allowed options allowed for each
>>> jhsdb sub-command is controlled with the longOpts argument.
>>>
>>> jmap has:
>>>           String[] longOpts = {"exe=", "core=", "pid=", "remote=",
>>>                 "heap", "binaryheap", "dumpfile=", "histo", 
>>> "clstats", "finalizerinfo"};
>>>
>>> but jstack has:
>>>           String[] longOpts = {"exe=", "core=", "pid=", "remote=", 
>>> "mixed", "locks"};
>>>
>>>> IMHO refactoring should be worked on another issue.
>>>
>>> Agreed.
>>>
>>>
>>>> If you are OK in above, I will upload new webrev.
>>>
>>> Yes, I'm Okay with it.
>>>
>>>
>>> Thanks,
>>> Serguei
>>>
>>>
>>>> Thanks,
>>>>
>>>> Yasumasa
>>>>
>>>>
>>>>> All the jhsdb sub-commands do execute similar loops like this:
>>>>> while((s = sg.next(null, longOpts)) != null) {
>>>>>          . . .
>>>>>      }
>>>>>
>>>>> It can be moved into a separate method instead.
>>>>> The longOpts can passed in arguments.
>>>>>
>>>>> It can be something like this:
>>>>>
>>>>>      private ArrayList<String> processOptions(final String[] oldArgs,
>>>>>                                               final String[] 
>>>>> longOpts,
>>>>>                                               boolean allowEmpty) {
>>>>>          SAGetopt sg = new SAGetopt(oldArgs);
>>>>>          ArrayList<String> newArgs = new ArrayList();
>>>>>
>>>>>          String pid = null;
>>>>>          String exe = null;
>>>>>          String core = null;
>>>>>          String s = null;
>>>>>          String dumpfile = null;
>>>>>          String remote = NO_REMOTE;
>>>>>          boolean requestHeapdump = false;
>>>>>
>>>>>          while((s = sg.next(null, longOpts)) != null) {
>>>>>              if (s.equals("exe")) {
>>>>>                  exe = sg.getOptarg();
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("core")) {
>>>>>                  core = sg.getOptarg();
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("pid")) {
>>>>>                   pid = sg.getOptarg();
>>>>>                   continue;
>>>>>              }
>>>>>              if (s.equals("remote")) {
>>>>>                  remote = sg.getOptarg();
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("mixed")) {
>>>>>                  newArgs.add("-m");
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("locks")) {
>>>>>                  newArgs.add("-l");
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("heap")) {
>>>>>                  newArgs.add("-heap");
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("binaryheap")) {
>>>>>                  requestHeapdump = true;
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("dumpfile")) {
>>>>>                  dumpfile = sg.getOptarg();
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("histo")) {
>>>>>                  newArgs.add("-histo");
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("clstats")) {
>>>>>                  newArgs.add("-clstats");
>>>>>                   continue;
>>>>>              }
>>>>>              if (s.equals("finalizerinfo")) {
>>>>>                  newArgs.add("-finalizerinfo");
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("flags")) {
>>>>>                  newArgs.add("-flags");
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("sysprops")) {
>>>>>                  newArgs.add("-sysprops");
>>>>>                  continue;
>>>>>              }
>>>>>              if (s.equals("serverid")) {
>>>>>                  String serverid = sg.getOptarg();
>>>>>                  if (serverid != null) {
>>>>>                      newArgs.add(serverid);
>>>>>                  }
>>>>>                  continue;
>>>>>              }
>>>>>          }
>>>>>
>>>>>          if (!requestHeapdump && (dumpfile != null)) {
>>>>>              throw new IllegalArgumentException("Unexpected 
>>>>> argument dumpfile");
>>>>>          }
>>>>>          if (requestHeapdump) {
>>>>>              if (dumpfile == null) {
>>>>>                  newArgs.add("-heap:format=b");
>>>>>              } else {
>>>>>                   newArgs.add("-heap:format=b,file=" + dumpfile);
>>>>>              }
>>>>>          }
>>>>>          buildAttachArgs(newArgs, pid, exe, core, remote, 
>>>>> allowEmpty);
>>>>>
>>>>>          return newArgs;
>>>>>      }
>>>>>
>>>>>      private static void runCLHSDB(String[] oldArgs) {
>>>>>          String[] longOpts = {"exe=", "core=", "pid="};
>>>>>          ArrayList<String> newArgs = processOptions(oldArgs, 
>>>>> longOpts, true);
>>>>>
>>>>>          CLHSDB.main(newArgs.toArray(new String[newArgs.size()]));
>>>>>      }
>>>>>
>>>>>      private static void runHSDB(String[] oldArgs) {
>>>>>          String[] longOpts = {"exe=", "core=", "pid="};
>>>>>           ArrayList<String> newArgs = processOptions(oldArgs, 
>>>>> longOpts, true);
>>>>>
>>>>>           HSDB.main(newArgs.toArray(new String[newArgs.size()]));
>>>>>      }
>>>>>
>>>>>      private static void runJSTACK(String[] oldArgs) {
>>>>>          String[] longOpts = {"exe=", "core=", "pid=", "remote=", 
>>>>> "mixed", "locks"};
>>>>>          ArrayList<String> newArgs = processOptions(oldArgs, 
>>>>> longOpts, false);
>>>>>
>>>>>          JStack jstack = new JStack(false, false);
>>>>>          jstack.runWithArgs(newArgs.toArray(new 
>>>>> String[newArgs.size()]));
>>>>>      }
>>>>>
>>>>>      private static void runJMAP(String[] oldArgs) {
>>>>>          String[] longOpts = {"exe=", "core=", "pid=", "remote=",
>>>>>                "heap", "binaryheap", "dumpfile=", "histo", 
>>>>> "clstats", "finalizerinfo"};
>>>>>
>>>>>          ArrayList<String> newArgs = processOptions(oldArgs, 
>>>>> longOpts, false);
>>>>>
>>>>>          JMap.main(newArgs.toArray(new String[newArgs.size()]));
>>>>>      }
>>>>>
>>>>>      private static void runJINFO(String[] oldArgs) {
>>>>>          String[] longOpts = {"exe=", "core=", "pid=", "remote=", 
>>>>> "flags", "sysprops"};
>>>>>          ArrayList<String> newArgs = processOptions(oldArgs, 
>>>>> longOpts, false);
>>>>>
>>>>>          JInfo.main(newArgs.toArray(new String[newArgs.size()]));
>>>>>      }
>>>>>
>>>>>      private static void runJSNAP(String[] oldArgs) {
>>>>>          String[] longOpts = {"exe=", "core=", "pid=", "remote=", 
>>>>> "all"};
>>>>>          ArrayList<String> newArgs = processOptions(oldArgs, 
>>>>> longOpts, false);
>>>>>          JSnap.main(newArgs.toArray(new String[newArgs.size()]));
>>>>>      }
>>>>>
>>>>>      private static void runDEBUGD(String[] oldArgs) {
>>>>>          // By default SA agent classes prefer Windows process 
>>>>> debugger
>>>>>          // to windbg debugger. SA expects special properties to 
>>>>> be set
>>>>>          // to choose other debuggers. We will set those here before
>>>>>          // attaching to SA agent.
>>>>> System.setProperty("sun.jvm.hotspot.debugger.useWindbgDebugger", 
>>>>> "true");
>>>>>
>>>>>          String[] longOpts = {"exe=", "core=", "pid=", "serverid="};
>>>>>          ArrayList<String> newArgs = processOptions(oldArgs, 
>>>>> longOpts, false);
>>>>>
>>>>>          // delegate to the actual SA debug server.
>>>>> sun.jvm.hotspot.DebugServer.main(newArgs.toArray(new 
>>>>> String[newArgs.size()]));
>>>>>      }
>>>>>
>>>>>
>>>>> Please, let me know what do you think.
>>>>>
>>>>> Thanks,
>>>>> Serguei
>>>>>
>>>>>
>>>>> On 6/9/19 7:29 PM, Yasumasa Suenaga wrote:
>>>>>> Sorry, new webrev is here:
>>>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8209790/webrev.01/
>>>>>>
>>>>>> Yasumasa
>>>>>>
>>>>>> 2019年6月10日(月) 11:27 Yasumasa Suenaga<yasuenag at gmail.com>:
>>>>>>> PING: Could you review them?
>>>>>>>
>>>>>>>>>>> JBS:https://bugs.openjdk.java.net/browse/JDK-8209790
>>>>>>>>>>> CSR:https://bugs.openjdk.java.net/browse/JDK-8224979
>>>>>>>>>>> webrev:http://cr.openjdk.java.net/~ysuenaga/JDK-8209790/webrev.00/ 
>>>>>>>>>>>
>>>>>>> It is P3 bug, but I want to fix it before JDK 13 RDP 1 if possible.
>>>>>>>
>>>>>>>
>>>>>>> Thanks,
>>>>>>>
>>>>>>> Yasumasa
>>>>>>>
>>>>>>>
>>>>>>> 2019年6月5日(水) 14:06 Yasumasa Suenaga<yasuenag at gmail.com>:
>>>>>>>> Hi Jc,
>>>>>>>>
>>>>>>>> Thank you for your comment!
>>>>>>>> I updated a webrev:
>>>>>>>>
>>>>>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8209790/webrev.01/
>>>>>>>>
>>>>>>>>>     - In runTests; if DebugdUtils implemented Closeable, you 
>>>>>>>>> could just do a try-with-resources instead of the finally 
>>>>>>>>> clause...
>>>>>>>> I created DebugdUtils for convenience class for attach - detach
>>>>>>>> mechanism of debug server.
>>>>>>>> IMHO it is prefer "detach" to "close" in this case.
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>>
>>>>>>>> Yasumasa
>>>>>>>>
>>>>>>>>
>>>>>>>> 2019年6月5日(水) 11:34 Jean Christophe Beyler<jcbeyler at google.com>: 
>>>>>>>>
>>>>>>>>> Hi Yasumasa,
>>>>>>>>>
>>>>>>>>> I'm not an official reviewer but I don't see an issue with the 
>>>>>>>>> CSR (except that this seems to be bringing a fork in the tools 
>>>>>>>>> with some handling remote and others not).
>>>>>>>>>
>>>>>>>>> However, this code is really repetitive and this is not the 
>>>>>>>>> place to do a big refactor probably but we could do a few nits 
>>>>>>>>> perhaps:
>>>>>>>>>     - Instead of every tool calling commonHelp with an 
>>>>>>>>> additional flag you could divide into commonHelp and 
>>>>>>>>> commonHelpWithRemote for the tools and they both call the 
>>>>>>>>> current commonHelp with that boolean; so that when we are 
>>>>>>>>> looking at the tool code we know what we are getting... So 
>>>>>>>>> something like:
>>>>>>>>>
>>>>>>>>> private static boolean commonHelp(String mode, boolean 
>>>>>>>>> canConnectToRemote) {
>>>>>>>>>      ..
>>>>>>>>>   }
>>>>>>>>>
>>>>>>>>> private static boolean commonHelp(String mode) {
>>>>>>>>>     return commonHelp(mode, false);
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> private static boolean commonHelpWithRemote(String mode) {
>>>>>>>>>     return commonHelp(mode, false);
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> and that way the tools that change are just going from:
>>>>>>>>> -        return commonHelp("jmap");
>>>>>>>>> +        return commonHelpWithRemote("jmap");
>>>>>>>>>
>>>>>>>>> - In the same vein, instead of passing null to the 
>>>>>>>>> buildAttachArgs; you could  make a variable null:
>>>>>>>>>
>>>>>>>>> -        buildAttachArgs(newArgs, pid, exe, core, true);
>>>>>>>>> +        String noRemote = null;
>>>>>>>>> +        buildAttachArgs(newArgs, pid, exe, core, noRemote, 
>>>>>>>>> true);
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> -http://cr.openjdk.java.net/~ysuenaga/JDK-8209790/webrev.00/test/hotspot/jtreg/serviceability/sa/sadebugd/DebugdUtils.java.html 
>>>>>>>>>
>>>>>>>>>     Nit: you have empty lines at l64 and l73
>>>>>>>>>
>>>>>>>>> -http://cr.openjdk.java.net/~ysuenaga/JDK-8209790/webrev.00/test/hotspot/jtreg/serviceability/sa/sadebugd/DebugdConnectTest.java.html 
>>>>>>>>>
>>>>>>>>>      Nit : you have an empty line at l110
>>>>>>>>>
>>>>>>>>>     - In runTests; if DebugdUtils implemented Closeable, you 
>>>>>>>>> could just do a try-with-resources instead of the finally 
>>>>>>>>> clause...
>>>>>>>>>
>>>>>>>>> All of these are details, I just thought I'd mention them :)
>>>>>>>>> Jc
>>>>>>>>>
>>>>>>>>> On Tue, Jun 4, 2019 at 6:44 PM Yasumasa 
>>>>>>>>> Suenaga<yasuenag at gmail.com>  wrote:
>>>>>>>>>> PING: Could you review them?
>>>>>>>>>>
>>>>>>>>>>> JBS:https://bugs.openjdk.java.net/browse/JDK-8209790
>>>>>>>>>>> CSR:https://bugs.openjdk.java.net/browse/JDK-8224979
>>>>>>>>>>> webrev:http://cr.openjdk.java.net/~ysuenaga/JDK-8209790/webrev.00/ 
>>>>>>>>>>>
>>>>>>>>>> CSR status is provisional. So I need reviewers both CSR and 
>>>>>>>>>> webrev.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>>
>>>>>>>>>> Yasumasa
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> 2019年5月29日(水) 22:37 Yasumasa Suenaga<yasuenag at gmail.com>:
>>>>>>>>>>> Hi all,
>>>>>>>>>>>
>>>>>>>>>>> Please review this change:
>>>>>>>>>>>
>>>>>>>>>>> JBS:https://bugs.openjdk.java.net/browse/JDK-8209790
>>>>>>>>>>> CSR:https://bugs.openjdk.java.net/browse/JDK-8224979
>>>>>>>>>>> webrev:http://cr.openjdk.java.net/~ysuenaga/JDK-8209790/webrev.00/ 
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> In JDK 8 or earlier, some tools (jstack, jmap, jinfo) can 
>>>>>>>>>>> connect to
>>>>>>>>>>> debug server (jsadebugd). However it has not done so since 
>>>>>>>>>>> JDK 9 because
>>>>>>>>>>> jhsdb cannot accept the attach request to debug server.
>>>>>>>>>>> So I want to introduce new option `--remote` to connect to 
>>>>>>>>>>> debug server.
>>>>>>>>>>>
>>>>>>>>>>> I created CSR for this issue. So please review it together.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>>
>>>>>>>>>>> Yasumasa
>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Jc
>>>>>
>>>
>



More information about the serviceability-dev mailing list