JDK-8219143: jdb should support breakpoint thread filters
Chris Plummer
chris.plummer at oracle.com
Thu Feb 21 03:56:24 UTC 2019
Please review the updated webrev:
http://cr.openjdk.java.net/~cjplummer/8219143/webrev.01/
The syntax is now:
stop [go|thread] [threadid <thread_id>] <at|in> <location>
I filed JDK-8219507 to cover BreakpointSpec.toString() improvements, and
other possible improvements to the output when listing breakpoints.
I did a minor fix in TTYResources.java to address a bug from a recent
JDK-8218941 commit that added the dbgtrace command. There was missing
newline. I've added a note to JDK-8218941 indicating that it is being
fixed here.
I've added a test. Below is a log of the debug session output that might
help with reading the source of the test. The test creates 3 threads
that all execute the same code, and verifies that the breakpoint set
using the threadid option only stops on the one specified thread.
thanks,
Chris
[jdb] Set uncaught java.lang.Throwable
[jdb] Set deferred uncaught java.lang.Throwable
[jdb] Initializing jdb ...
[jdb]
[jdb] VM Started: > No frames on the current call stack
[jdb]
[jdb] main[1]
> stop in JdbStopThreadidTestTarg.brkMethod
[jdb] Deferring breakpoint JdbStopThreadidTestTarg.brkMethod.
[jdb] It will be set after the class is loaded.
[jdb] main[1]
> run
[jdb] > Set deferred breakpoint JdbStopThreadidTestTarg.brkMethod
[jdb]
[jdb] Breakpoint hit: "thread=main",
JdbStopThreadidTestTarg.brkMethod(), line=80 bci=0
[jdb] 80 }
[jdb]
[jdb] main[1]
> threads
[jdb] Group system:
[jdb] (java.lang.ref.Reference$ReferenceHandler)367 Reference Handler
running
[jdb] (java.lang.ref.Finalizer$FinalizerThread)368 Finalizer
cond. waiting
[jdb] (java.lang.Thread)369 Signal Dispatcher
running
[jdb] Group main:
[jdb] (java.lang.Thread)1 main running (at breakpoint)
[jdb] (JdbStopThreadidTestTarg$MyThread)482 MYTHREAD-1 waiting
in a monitor
[jdb] (JdbStopThreadidTestTarg$MyThread)483 MYTHREAD-2 waiting
in a monitor
[jdb] (JdbStopThreadidTestTarg$MyThread)484 MYTHREAD-3 waiting
in a monitor
[jdb] Group InnocuousThreadGroup:
[jdb] (jdk.internal.misc.InnocuousThread)416 Common-Cleaner cond.
waiting
[jdb] main[1]
> stop threadid 483 in JdbStopThreadidTestTarg$MyThread.brkMethod
[jdb] Set breakpoint JdbStopThreadidTestTarg$MyThread.brkMethod
[jdb] main[1]
> cont
[jdb] >
[jdb] Breakpoint hit: "thread=MYTHREAD-2",
JdbStopThreadidTestTarg$MyThread.brkMethod(), line=101 bci=0
[jdb] 101 }
[jdb]
[jdb] MYTHREAD-2[1]
> cont
[jdb] >
[jdb] The application exited
[jdb]
On 2/20/19 2:23 PM, Chris Plummer wrote:
> On 2/20/19 2:00 PM, Alex Menkov wrote:
>> Hi Chris,
>>
>> - New threadid param breaks at/in clause - this doesn't look good.
>> Maybe it would be better to put threadid before in/at:
>> stop [go|thread] [threadid <thread_id>] <at|in> <location>
> Ok. I'll try moving it.
>> This also would make commandStop/parseBreakpointSpec logic more clear:
>> commandStop handles go/thread/threadid, parseBreakpointSpec handles
>> position (part starting from in/at);
>>
>> - do you think BreakpointSpec toString should contain info about the
>> thread (i.e. to specified in the breakpoint list)?;
> I had added this at one point, alone with also adding the suspend
> policy. You then see both of these when you use "stop in/at" or
> "clear" without any arguments (it lists the breakpoints in this case).
> I was a little worried that the extra text might break something, so I
> left it out. Note also that currently the text given when you list
> breakpoints is exactly the text you need to enter when using the clear
> command, so that would no longer be true if I added any more text.
> However, I did envision a better version of this that not only include
> the suspend policy and threadid, but also a breakpoint index, allowing
> you to more easily clear one after listing it. Maybe I could add an
> RFE for this.
>>
>> - it would be nice to add a test for the new threadid functionality.
>
> I've been working on one today. It's near completion.
>
> Chris
>
>>
>> --alex
>>
>> On 02/19/2019 21:57, Chris Plummer wrote:
>>> Hello,
>>>
>>> Please review the following:
>>>
>>> http://cr.openjdk.java.net/~cjplummer/8219143/webrev.00/
>>> https://bugs.openjdk.java.net/browse/JDK-8219143
>>>
>>> Normally when a breakpoint is set in jdb, it is set globally (all
>>> threads). JDI supports the ability to have the breakpoint be
>>> automatically filtered so it will only be delivered on a specified
>>> thread and ignored on all other threads. This change allows making
>>> use of that JDI feature from jdb. So instead of something like:
>>>
>>> stop at Foo:23
>>>
>>> You can now do:
>>>
>>> stop at threadid 7 Foo:23
>>>
>>> Where 7 is the threadID for the thread as seen in the output of the
>>> "threads" command. The format of the stop command is now:
>>>
>>> stop [go|thread] <at|in> [threadid <thread_id>] <location>
>>>
>>> It is still fully backwards compatible.
>>>
>>> As part of this change I also cleaned up the "stop" command parsing
>>> and error handling. It was kind of a mess, and was near impossible
>>> to add the "threadid" option until after I did much of the cleanup.
>>> I've also cleaned up the help output a lot, and added help for the
>>> "go" and "thread" options. One last change was to remove the
>>> distinction between "stop at" and "stop in", which was suggested
>>> already in a comment. They can be used interchangeably now. The
>>> changes in Commands.java are pretty much all just the above cleanup,
>>> except for the one short section with the 'Handle "threadid"
>>> modifier' comment.
>>>
>>> thanks,
>>>
>>> Chris
>>>
>
>
More information about the serviceability-dev
mailing list