RFR 8150689: Thread dump report "waiting to re-lock in wait()" shows incorrectly
David Holmes
david.holmes at oracle.com
Tue Nov 20 22:34:19 UTC 2018
Hi Patricio,
On 21/11/2018 3:51 am, Patricio Chilano wrote:
> Hi all,
>
> Could you review this small fix for thread dump reports?
> Now the "waiting to re-lock in wait()" message is shown in the "at
> java.lang.Object.wait(Native Method)" frame where the re-locking is
> actually occurring. In the frame where the lock was first taken we
> always show "locked". Please check if there is some scenario where you
> think the lock info on the stack is not being printed as you would expect.
Can you please update the bug report with examples of how the stack
report now looks compared to those used to discuss the bug.
I applied the patch and ran my examples and they looked good!
> I also noticed the _thread_state attribute was printed twice so I
> removed one instance. I don't know if there was a specific reason to
> print it twice so I can add it back.
ThreadSafepointState::print_on is called from both the stack dump code
(where you see _thread_state twice) and safepoint logging. It's useful
to also see the thread state during safepoint logging so please undo
this change.
src/hotspot/share/runtime/vframe.cpp
182
if(java_lang_Thread::get_thread_status(thread()->threadObj()) ==
java_lang_Thread::BLOCKED_ON_MONITOR_ENTER){
Nit: need space after "if", need space after ")"
Nit please line-break after == and indent appropriately
This seems such an obvious check I have to really question why we did
not do this before, and had the comment that the two states could not be
distinguished. :)
I think what you have done simplifies things nicely, and as I said my
two main examples now work fine.
> Webrev URL: http://cr.openjdk.java.net/~pchilanomate/8150689.01/webrev
> Bug URL: https://bugs.openjdk.java.net/browse/JDK-8150689
Please always advise what testing you did. In this case I think we have
a problem with a test, but it seems to be a pre-existing problem:
serviceability/tmtools/jstack/WaitNotifyThreadTest.java
Seems to expect to find a "waiting to re-lock" line but in fact I can't
see anything in the test that actually creates a situation where the
thread would be waiting to re-lock! Further the test is supposed to
print out:
System.out.println("Correct monitor info found");
yet there is no such output. This indicates that the test is not working
as expected and is not actually finding any locks. I think the logic for
checking the method "name" is broken e.g.
if (mi.getName().startsWith("WaitThread.run")) {
the actual name is WaitNotifyThreadTest$WaitThread.run so it won't match!
Also:
if (mi.getName().startsWith(OBJECT_WAIT) && mi.getCompilationUnit() ==
null /*native method*/) {
won't match anything either as far as I can see!
<sigh> I filed a bug for that test: JDK-8214148
Thanks,
David
> Thanks,
> Patricio
More information about the hotspot-runtime-dev
mailing list