Ok by me
Sent from my iPad > On Oct 22, 2018, at 8:26 PM, Daniil Titov <daniil.x.ti...@oracle.com> wrote: > > Thank you, Chris for reviewing this change! > > Alex, JC, Garry could you please say are you OK with this version of the > webrev? > > Webrev: http://cr.openjdk.java.net/~dtitov/8211736/webrev.05/ > Issue: https://bugs.openjdk.java.net/browse/JDK-8211736 > > Best regards, > Daniil > > On 10/22/18, 11:18 AM, "Chris Plummer" <chris.plum...@oracle.com> wrote: > > Hi Daniil, > > Looks good. > > thanks, > > Chris > >> On 10/19/18 4:01 PM, Daniil Titov wrote: >> Hi Chris, >> >> Please review an updated version of the fix that makes the tests to use a >> custom pattern while waiting for the command to complete. >> >> Webrev: http://cr.openjdk.java.net/~dtitov/8211736/webrev.05/ >> Issue: https://bugs.openjdk.java.net/browse/JDK-8211736 >> >> Thanks! >> --Daniil >> >> >> On 10/19/18, 12:55 PM, "Chris Plummer" <chris.plum...@oracle.com> wrote: >> >>> On 10/19/18 9:47 AM, Daniil Titov wrote: >>> Hi Gary and Chris, >>> >>> I am resending the previous email since the table in that email got >>> corrupted. >>> >>> Below is what output jdb prints when a breakpoint is hit depending on what >>> suspended policy is used: >>> >>> The current behavior. >>> SUSPEND_ALL: Prompt is printed ( e.g. "main[1]"), location is printed >>> SUSPEND_EVENT_THREAD: Prompt is not printed, location is not printed >>> SUSPEND_NONE: Prompt is not printed, location is not printed >>> >>> The fix changes this behavior as the following: >>> >>> SUSPEND_ALL: Prompt is printed ( e.g. "main[1]"), location is printed >>> SUSPEND_EVENT_THREAD: Prompt is printed ( "> "), location is printed >>> SUSPEND_NONE: Prompt is printed ( "> "), location is printed >> I'm still in favor of this fix. >>> >>> >>> Could you please say is it OK for you or you want that the location was >>> printed only for SUSPEND_ALL case? Or probably just leave all behavior >>> unchanged and close the bug as "not an issue"? >>> >>> Regarding settable prompt... As I understand Gary's original concern was >>> that waiting in tests for a simple prompt " > " (> ) could be >>> unreliable if this substring somehow appears in the output of the test >>> program and the suggestion was to use more specific patterns for the cases >>> when the full prompt (thread_name[frame_index]) is not printed ( e.g. when >>> the current thread is not set). However, we need somehow pass this pattern >>> to Jdb.command(JdbCommand) method otherwise it would keep waiting for the >>> full prompt and fail with the timeout. Probably I am missing something >>> here... >> Maybe we need a version of command() that takes a pattern to look for >> other than the prompt. >> >> Chris >>> >>> >>> Thanks! >>> --Daniil >>> >>> On 10/19/18, 9:27 AM, "Daniil Titov" <daniil.x.ti...@oracle.com> wrote: >>> >>> Hi Gary and Chris, >>> >>> Below is the table that shows what jdb output is printed when a >>> breakpoint is hit depending on what suspended policy is used: >>> >>> SUSPEND POLICY | PROMPT PRINTED | LOCATION >>> PRINTED >>> --------------------------------------- >>> |---------------------------|-------------------------- >>> SUSPEND_ALL. | yes, e.g. "main[1]" | >>> yes >>> --------------------------------------- |-------------------------- >>> |-------------------------- >>> SUSPEND_EVENT_THREAD | no | no >>> ----------------------------------------|------------------------ >>> --|-------------------------- >>> SUSPEND_ALL. | no >>> | no >>> >>> >>> The fix changes this behavior as the following: >>> >>> SUSPEND POLICY | PROMPT PRINTED. | LOCATION >>> PRINTED >>> --------------------------------------- >>> |----------------------------|-------------------------- >>> SUSPEND_ALL. | yes , e.g. "main[1]" | >>> yes >>> --------------------------------------- >>> |----------------------------|-------------------------- >>> SUSPEND_EVENT_THREAD | yes , ">" | >>> yes >>> ----------------------------------------|--------------------------- >>> |-------------------------- >>> SUSPEND_ALL. | yes, ">". >>> | yes >>> >>> Could you please say is it OK for you or you want that the location was >>> printed only for SUSPEND_ALL case? Or probably just leave all behavior >>> unchanged and close the bug as "not an issue"? >>> >>> Regarding settable prompt... As I understand Gary's original concern >>> was that waiting in tests for a simple prompt " > " (> ) could be >>> unreliable if this substring somehow appears in the output of the test >>> program and the suggestion was to use more specific patterns for the cases >>> when the full prompt (thread_name[frame_index]) is not printed ( e.g. when >>> the current thread is not set). However, we need somehow pass this pattern >>> to Jdb.command(JdbCommand) method otherwise it would keep waiting for the >>> full prompt and fail with the timeout. Probably I am missing something >>> here... >>> >>> >>> Thanks! >>> >>> Best regards, >>> Daniil >>> >>> >>> >>> On 10/19/18, 12:54 AM, "gary.ad...@oracle.com" <gary.ad...@oracle.com> >>> wrote: >>> >>> It's not clear to me if the omitted location information for the non >>> stopping >>> cases was intentional or not. It may be sufficient to know that the >>> event fired >>> without the extra information. >>> >>> I don't think a settable prompt is required either. There are >>> plenty of >>> jdb commands that >>> could be used with the wait for message in tests that need to >>> synchronize at a specific >>> point in the test sequence. >>> >>> I don't think we see wait for simple prompt in any of the tests, >>> because it >>> is not reliable enough. >>> >>>> On 10/18/18 11:53 AM, Daniil Titov wrote: >>>> Hi Gary, >>>> >>>> Currently when a breakpoint is hit the message "Breakpoint hit:" is >>>> printed in the debugger output. What we do in this fix we just add more >>>> information about what exact breakpoint is hit. Do you suggest we should >>>> not print this line at all if suspend policy is SUSPEND_NONE? If so then >>>> it is not clear what is the use of the command "stop go ..." would be. >>>> Regarding waiting for the simple prompt, we could change JDbCommand to >>>> have a field to store a prompt pattern and use this pattern (if it was >>>> set) when waiting for command to complete. In tests when required we would >>>> set the pattern in JdbCommand to more complicated one matching a specific >>>> output we are expecting at this particular step. Do you think it would be >>>> a better approach? >>>> >>>> Thanks! >>>> >>>> Best regards, >>>> Daniil >>>> >>>> >>>> >>>> On 10/18/18, 4:09 AM, "Gary Adams" <gary.ad...@oracle.com> wrote: >>>> >>>> I'm not certain that we should be printing locations or prompts for >>>> events when the vm has not been suspended. This looks OK for the >>>> simple test case we are working on here, but in real life there may >>>> be a lot more output produced. >>>> >>>> The user has to select a specific thread before additional commands >>>> can be performed in the correct context. e.g. threads, thread n, >>>> where, ... >>>> So the information is available to the user. It doesn't have to be >>>> produced at the time the event is processed. >>>> >>>> I'm uncomfortable putting too much trust in waiting for the simple >>>> prompt, >>>> because there is too great a chance of false positives on such a small >>>> marker. >>>> >>>> >>>>> On 10/17/18, 8:50 PM, Daniil Titov wrote: >>>>> Hi Chris, Alex and JC, >>>>> >>>>> I created a separate issue to deal with "non-atomic" jdb output at >>>>> https://bugs.openjdk.java.net/browse/JDK-8212626 . >>>>> >>>>> Please review an updated fix that includes the changes Alex suggested. >>>>> >>>>> Webrev: http://cr.openjdk.java.net/~dtitov/8211736/webrev.04 >>>>> Issue: https://bugs.openjdk.java.net/browse/JDK-8211736 >>>>> >>>>> Thanks! >>>>> --Daniil >>>>> >>>>> >>>>> On 10/17/18, 5:06 PM, "Daniil Titov"<daniil.x.ti...@oracle.com> wrote: >>>>> >>>>> Hi Chris, >>>>> >>>>> The previous email was accidentally fired before I managed to type >>>>> anything in. Sorry for confusion. >>>>> >>>>> Jdb constantly reads new commands from System.in despite whether the >>>>> breakpoint is hit and/or the prompt is printed. >>>>> >>>>> cat -n >>>>> src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTY.java >>>>> >>>>> 786 // Process interactive commands. >>>>> 787 MessageOutput.printPrompt(); >>>>> 788 while (true) { >>>>> 789 String ln = in.readLine(); >>>>> 790 if (ln == null) { >>>>> 791 /* >>>>> 792 * Jdb is being shutdown because >>>>> debuggee exited, ignore any 'null' >>>>> 793 * returned by readLine() during >>>>> shutdown. JDK-8154144. >>>>> 794 */ >>>>> 795 if (!isShuttingDown()) { >>>>> 796 MessageOutput.println("Input stream >>>>> closed."); >>>>> 797 } >>>>> 798 ln = "quit"; >>>>> 799 } >>>>> 800 >>>>> 801 if (ln.startsWith("!!")&& lastLine != >>>>> null) { >>>>> 802 ln = lastLine + ln.substring(2); >>>>> 803 MessageOutput.printDirectln(ln);// >>>>> Special case: use printDirectln() >>>>> 804 } >>>>> 805 >>>>> 806 StringTokenizer t = new StringTokenizer(ln); >>>>> 807 if (t.hasMoreTokens()) { >>>>> 808 lastLine = ln; >>>>> 809 executeCommand(t); >>>>> 810 } else { >>>>> 811 MessageOutput.printPrompt(); >>>>> 812 } >>>>> 813 } >>>>> 814 } catch (VMDisconnectedException e) { >>>>> 815 handler.handleDisconnectedException(); >>>>> 816 } >>>>> >>>>> Below is a sample debug session for the following test class that >>>>> sends commands "threads" and "quit" >>>>> 1 public class LoopTest { >>>>> 2 public static void main(String[] args) throws Exception >>>>> { >>>>> 3 Thread thread = Thread.currentThread(); >>>>> 4 while(true) { >>>>> 5 print(thread); >>>>> 6 Thread.sleep(5000); >>>>> 7 } >>>>> 8 } >>>>> 9 >>>>> 10 public static void print(Object obj) { >>>>> 11 //System.out.println(obj); >>>>> 12 } >>>>> 13 } >>>>> >>>>> datitov-mac:work datitov$ >>>>> ~/src/jdk-hs/build/macosx-x64-debug/images/jdk/bin/jdb LoopTest >>>>> Initializing jdb ... >>>>>> stop go at LoopTest:6 >>>>> Deferring breakpoint LoopTest:6. >>>>> It will be set after the class is loaded. >>>>>> run >>>>> run LoopTest >>>>> Set uncaught java.lang.Throwable >>>>> Set deferred uncaught java.lang.Throwable >>>>>> >>>>> VM Started: Set deferred breakpoint LoopTest:6 >>>>> >>>>> Breakpoint hit: "thread=main", LoopTest.main(), line=6 bci=8 >>>>> 6 Thread.sleep(5000); >>>>> >>>>> Breakpoint hit: "thread=main", LoopTest.main(), line=6 bci=8 >>>>> 6 Thread.sleep(5000); >>>>> threads >>>>> Group system: >>>>> (java.lang.ref.Reference$ReferenceHandler)0x172 Reference Handler >>>>> running >>>>> (java.lang.ref.Finalizer$FinalizerThread)0x173 Finalizer >>>>> cond. waiting >>>>> (java.lang.Thread)0x174 Signal Dispatcher >>>>> running >>>>> Group main: >>>>> (java.lang.Thread)0x1 main >>>>> sleeping >>>>> Group InnocuousThreadGroup: >>>>> (jdk.internal.misc.InnocuousThread)0x197 Common-Cleaner >>>>> cond. waiting >>>>>> >>>>> Breakpoint hit: "thread=main", LoopTest.main(), line=6 bci=8 >>>>> 6 Thread.sleep(5000); >>>>> >>>>> Breakpoint hit: "thread=main", LoopTest.main(), line=6 bci=8 >>>>> 6 Thread.sleep(5000); >>>>> quit >>>>> Breakpoint hit: "thread=main", LoopTest.main(), line=6 bci=8 >>>>> 6 Thread.sleep(5000); >>>>> >>>>> datitov-mac:work datitov$ >>>>> >>>>> I think we could print a simple prompt in this case as Alex suggested. >>>>> >>>>> Best regards, >>>>> Daniil >>>>> >>>>> On 10/17/18, 3:52 PM, "Chris Plummer"<chris.plum...@oracle.com> >>>>> wrote: >>>>> >>>>> What is the jdb state for a breakpoint with SUSPEND_NONE? Can you >>>>> actually type in commands even though no threads are suspended? >>>>> >>>>> Chris >>>>> >>>>>> On 10/17/18 3:31 PM, Alex Menkov wrote: >>>>>> Hi Daniil, Chris, >>>>>> >>>>>> As far as I understand, the fix does not completely fixes all >>>>>> "non-atomic" output issues (at least TTY.executeCommand still prints >>>>>> prompt separately), so I agree that handle it as separate issue would >>>>>> be better. >>>>>> Unfortunately I don't know Gary's ideas for the issue. >>>>>> >>>>>> About the fix for print prompt: >>>>>> 1) TTY.java: >>>>>> + // Print current location if suspend policy is SUSPEND_NONE >>>>>> I suppose you mean "Print breakpoint location" >>>>>> >>>>>> 2) Does it make sense to use printCurrentLocation for >>>>>> SUSPEND_EVENT_THREAD? >>>>>> Is it expected to print something different from printBreakpointLocation? >>>>>> >>>>>> 3) I don't quite understand why we don't print simple prompt for >>>>>> SUSPEND_NONE. IIUC jdb can accept new command in both >>>>>> SUSPEND_EVENT_THREAD and SUSPEND_NONE cases (prompt shows that jdb >>>>>> waits for next command, right?) >>>>>> >>>>>> 4) JdbStopThreadTest.java >>>>>> New line line in Java regexp is "\\R" >>>>>> >>>>>> --alex >>>>>> >>>>>>> On 10/17/2018 10:47, Chris Plummer wrote: >>>>>>> Hi Alex, >>>>>>> >>>>>>> I think the tty buffering should be a separate bug fix, and I'd also >>>>>>> like input from Gary on it since he had tried something similar at >>>>>>> one point. It should probably also include a multithread test to >>>>>>> prove the fix is working (after first getting the test to fail >>>>>>> without the changes). >>>>>>> >>>>>>> thanks, >>>>>>> >>>>>>> Chris >>>>>>> >>>>>>>> On 10/16/18 8:59 PM, Daniil Titov wrote: >>>>>>>> Hi Alex, Chris and JC, >>>>>>>> >>>>>>>> Please review an updated version of the patch that addresses these >>>>>>>> issues. >>>>>>>> >>>>>>>> Webrev: http://cr.openjdk.java.net/~dtitov/8211736/webrev.03/ >>>>>>>> Issue: https://bugs.openjdk.java.net/browse/JDK-8211736 >>>>>>>> >>>>>>>> Thanks! >>>>>>>> --Daniil >>>>>>>> >>>>>>>> >>>>>>>> On 10/12/18, 9:52 AM, "Alex Menkov"<alexey.men...@oracle.com> wrote: >>>>>>>> >>>>>>>> Hi Daniil, >>>>>>>> 1) +1 for printCurrentLocation when suspendPolicy != SUSPEND_ALL >>>>>>>> 2) wrong indent in JdbStopThreadTest.java: >>>>>>>> 36 import lib.jdb.JdbCommand; >>>>>>>> 37 import lib.jdb.JdbTest; >>>>>>>> 3) I think it would be better to make waitForSimplePrompt >>>>>>>> property of >>>>>>>> JdbCommand (like JdbCommand.allowExit) >>>>>>>> jdb.command(JdbCommand.run().replyIsSimplePrompt()); >>>>>>>> looks much clearer than >>>>>>>> jdb.command(JdbCommand.run(), true); >>>>>>>> 4) (TTY.java) >>>>>>>> MessageOutput.lnprint("Breakpoint hit:"); >>>>>>>> + // Print current location and prompt if suspend policy is >>>>>>>> SUSPEND_EVENT_THREAD. >>>>>>>> + // In case of SUSPEND_ALL policy this is handled by >>>>>>>> vmInterrupted() >>>>>>>> method. >>>>>>>> + if (be.request().suspendPolicy() == >>>>>>>> EventRequest.SUSPEND_EVENT_THREAD) { >>>>>>>> + printCurrentLocation(ThreadInfo.getThreadInfo(be.thread())); >>>>>>>> + MessageOutput.printPrompt(); >>>>>>>> + } >>>>>>>> We have 3 separate outputs. >>>>>>>> If we have several concurrent threads, we can easy get mess of >>>>>>>> outputs >>>>>>>> from different threads. >>>>>>>> I think it would be better to print everything in a single chunk. >>>>>>>> I suppose TTY has other places with similar "non-atomic" >>>>>>>> output, so >>>>>>>> maybe revising TTY output should be handled by separate issue. >>>>>>>> --alex >>>>>>>>> On 10/11/2018 22:00, Chris Plummer wrote: >>>>>>>>> Hi Daniil, >>>>>>>>> >>>>>>>>> Can you send output from an example jdb session? >>>>>>>>> >>>>>>>>> Do you think maybe we should also call printCurrentLocation() >>>>>>>> when the >>>>>>>>> suspend policy is NONE? >>>>>>>>> >>>>>>>>> There's a typo in the following line. The space is on the >>>>>>>> wrong side of >>>>>>>>> the comma. >>>>>>>>> >>>>>>>>> 72 jdb.command(JdbCommand.stopThreadAt(DEBUGGEE_CLASS >>>>>>>> ,bpLine)); >>>>>>>>> >>>>>>>>> thanks, >>>>>>>>> >>>>>>>>> Chris >>>>>>>>> >>>>>>>>>> On 10/11/18 8:02 PM, Daniil Titov wrote: >>>>>>>>>> >>>>>>>>>> Thank you, JC! >>>>>>>>>> >>>>>>>>>> Please review an updated version of the patch that fixes >>>>>>>> newly added >>>>>>>>>> test for Windows platform (now it uses system dependent line >>>>>>>>>> separator string). >>>>>>>>>> >>>>>>>>>> Webrev:http://cr.openjdk.java.net/~dtitov/8211736/webrev.02/ >>>>>>>>>> <http://cr.openjdk.java.net/%7Edtitov/8211736/webrev.02/> >>>>>>>>>> >>>>>>>>>> Issue: https://bugs.openjdk.java.net/browse/JDK-8211736 >>>>>>>>>> >>>>>>>>>> Best regards, >>>>>>>>>> >>>>>>>>>> --Daniil >>>>>>>>>> >>>>>>>>>> *From: *JC Beyler<jcbey...@google.com> >>>>>>>>>> *Date: *Thursday, October 11, 2018 at 7:17 PM >>>>>>>>>> *To: *<daniil.x.ti...@oracle.com> >>>>>>>>>> *Cc: *<serviceability-dev@openjdk.java.net> >>>>>>>>>> *Subject: *Re: RFR 8211736: jdb doesn't print prompt when >>>>>>>> breakpoint >>>>>>>>>> is hit and suspend policy is STOP_EVENT_THREAD >>>>>>>>>> >>>>>>>>>> Hi Daniil, >>>>>>>>>> >>>>>>>>>> Looks good to me. I saw a really small nit: >>>>>>>>>> >>>>>>>>>> >>>>>>>> http://cr.openjdk.java.net/~dtitov/8211736/webrev.01/test/jdk/com/sun/jdi/JdbStopThreadTest.java.html >>>>>>>> >>>>>>>>>> >>>>>>>> <http://cr.openjdk.java.net/%7Edtitov/8211736/webrev.01/test/jdk/com/sun/jdi/JdbStopThreadTest.java.html> >>>>>>>> >>>>>>>>>> >>>>>>>>>> 70 jdb.command(JdbCommand.stopThreadAt( DEBUGGEE_CLASS >>>>>>>> ,bpLine)); >>>>>>>>>> >>>>>>>>>> There is a space after the '('. >>>>>>>>>> >>>>>>>>>> No need to send a new webrev for that evidently :), >>>>>>>>>> >>>>>>>>>> Jc >>>>>>>>>> >>>>>>>>>> On Thu, Oct 11, 2018 at 5:07 PM Daniil Titov >>>>>>>>>> <daniil.x.ti...@oracle.com >>>>>>>> <mailto:daniil.x.ti...@oracle.com>> wrote: >>>>>>>>>> >>>>>>>>>> Please review the change that fixes the issue with >>>>>>>> missing prompt >>>>>>>>>> in jdb when a breakpoint is hit and the suspend policy >>>>>>>> is set to >>>>>>>>>> stop the thread only. >>>>>>>>>> >>>>>>>>>> Webrev: >>>>>>>> http://cr.openjdk.java.net/~dtitov/8211736/webrev.01 >>>>>>>>>> <http://cr.openjdk.java.net/%7Edtitov/8211736/webrev.01> >>>>>>>>>> Issue: https://bugs.openjdk.java.net/browse/JDK-8211736 >>>>>>>>>> >>>>>>>>>> Thanks! >>>>>>>>>> --Daniil >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> >>>>>>>>>> Jc >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>> >>> >>> >>> >>> >>> >> >> >> >> >> > > > > >