[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-hotspot-dev
Subject: Re: RFR (XS): 8035983: Fix "Native frames:" in crash report (hs_err file)
From: Vladimir Kozlov <vladimir.kozlov () oracle ! com>
Date: 2014-02-28 23:25:48
Message-ID: 53111AFC.6 () oracle ! com
[Download RAW message or body]
On 2/27/14 7:59 PM, Christian Thalinger wrote:
>
> On Feb 27, 2014, at 6:39 PM, Vladimir Kozlov <vladimir.kozlov@oracle.com> wrote:
>
> > http://cr.openjdk.java.net/~kvn/8035983/webrev.01/
> >
> > New check is used only for JavaThread where it is definitely initialized and \
> > where we have problem with call stack dump.
>
> Looks good. Just to be sure; +1 would also work here:
>
> + if (!_thread->on_local_stack((address)(fr.sp() + 4)))
>
> Right?
No, for Stack: [0xffff80ffa69f8000,0xffff80ffa6af8000]
I see for first frame "_lwp_start+0x0"
frame::_sp = 0xffff80ffa6af7ff0
I just tested it on SPARC and it needs more than +4 (+11), the first
frame has:
frame::_sp = 0xffffffff6befff50
It seems using fr.sender_sp() in the check work on x86 and sparc.
On x86 it return stack_base value on sparc it returns STACK_BIAS.
if (!_thread->on_local_stack((address)(fr.sender_sp() + 1)))
break;
http://cr.openjdk.java.net/~kvn/8035983/webrev.02/
Thanks,
Vladimir
>
> >
> > thanks,
> > Vladimir
> >
> > On 2/27/14 6:31 PM, Christian Thalinger wrote:
> > >
> > > On Feb 27, 2014, at 6:08 PM, Vladimir Kozlov <vladimir.kozlov@oracle.com> \
> > > wrote:
> > > >
> > > >
> > > > On 2/27/14 5:38 PM, Christian Thalinger wrote:
> > > > >
> > > > > On Feb 27, 2014, at 4:33 PM, Vladimir Kozlov <vladimir.kozlov@oracle.com> \
> > > > > wrote:
> > > > > > https://bugs.openjdk.java.net/browse/JDK-8035983
> > > > > > http://cr.openjdk.java.net/~kvn/8035983/webrev/
> > > > > >
> > > > > > We don't print whole stack if native frames intermix with compiled java \
> > > > > > frames (on x86 fp is used by compiled code). Instead of using \
> > > > > > os::is_first_C_frame() which produces incorrect result for compiled java \
> > > > > > frames I am suggesting to look on frame's stack pointer relative to stack \
> > > > > > base.
> > > > >
> > > > > I have two questions:
> > > > >
> > > > > 1) Why does this work:
> > > > >
> > > > > + // Catch very first native frame by using stack address.
> > > > > + if (!_thread->on_local_stack((address)(fr.sp() + 4))) break;
> > > > >
> > > > > Because we set the stack base to the current value when we start the \
> > > > > thread?
> > > >
> > > > You are right not all threads have stack base set (all VM's thread do). So I \
> > > > need to add check for stack_size() != 0 and use is_first_C_frame() if it is 0 \
> > > > (uninitialized).
> > >
> > > Maybe add a comment why the on_local_stack() check works.
> > >
> > > >
> > > > >
> > > > > 2) Why does this not work? I have seen many correct stack traces in the \
> > > > > past.
> > > >
> > > > Look on os::is_first_C_frame(). It does some stupid simple checks which \
> > > > nothing to do with real value. The test will pass if a java compiled code has \
> > > > a pointer in EBP register.
> > >
> > > Ah, that’s what I was missing. Makes sense then. Yeah, the code in \
> > > os::is_first_C_frame() is weird :-)
> > > >
> > > > Thanks,
> > > > Vladimir
> > > >
> > > > >
> > > > > >
> > > > > > Thanks,
> > > > > > Vladimir
> > > > > >
> > > > > > Output before the fix:
> > > > > >
> > > > > > Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native \
> > > > > > code) V [libjvm.so+0x1e28428] void \
> > > > > > VMError::report(outputStream*)+0x1478 V [libjvm.so+0x1e29dd4] void \
> > > > > > VMError::report_and_die()+0x6b4 V [libjvm.so+0x14ad9ba] void \
> > > > > > report_vm_error(const char*,int,const char*,const char*)+0x9a V \
> > > > > > [libjvm.so+0x1b6ccf5] void ObjectMonitor::exit(bool,Thread*)+0x125 V \
> > > > > > [libjvm.so+0x1d41cda] void \
> > > > > > ObjectSynchronizer::fast_exit(oopDesc*,BasicLock*,Thread*)+0x38a V \
> > > > > > [libjvm.so+0x1d41fba] void \
> > > > > > ObjectSynchronizer::slow_exit(oopDesc*,BasicLock*,Thread*)+0x2a V \
> > > > > > [libjvm.so+0x1caa13f] void \
> > > > > > SharedRuntime::complete_monitor_unlocking_C(oopDesc*,BasicLock*)+0x27f
> > > > > >
> > > > > > After the fix:
> > > > > >
> > > > > > Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native \
> > > > > > code) V [libjvm.so+0x1e28428] void \
> > > > > > VMError::report(outputStream*)+0x1478 V [libjvm.so+0x1e29dd4] void \
> > > > > > VMError::report_and_die()+0x6b4 V [libjvm.so+0x14ad9ba] void \
> > > > > > report_vm_error(const char*,int,const char*,const char*)+0x9a V \
> > > > > > [libjvm.so+0x1b6ccf5] void ObjectMonitor::exit(bool,Thread*)+0x125 V \
> > > > > > [libjvm.so+0x1d41cda] void \
> > > > > > ObjectSynchronizer::fast_exit(oopDesc*,BasicLock*,Thread*)+0x38a V \
> > > > > > [libjvm.so+0x1d41fba] void \
> > > > > > ObjectSynchronizer::slow_exit(oopDesc*,BasicLock*,Thread*)+0x2a V \
> > > > > > [libjvm.so+0x1caa13f] void \
> > > > > > SharedRuntime::complete_monitor_unlocking_C(oopDesc*,BasicLock*)+0x27f J \
> > > > > > 13 C2 java.util.Hashtable.get(Ljava/lang/Object;)Ljava/lang/Object; (69 \
> > > > > > bytes) @ 0xffff80ffb979da84 [0xffff80ffb979d700+0x384] J 10% C2 \
> > > > > > Test.Worker()V (381 bytes) @ 0xffff80ffb97a1c8c \
> > > > > > [0xffff80ffb97a1840+0x44c] j Test$1.run()V+0
> > > > > > v ~StubRoutines::call_stub
> > > > > > V [libjvm.so+0x177d196] void \
> > > > > > JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x886
> > > > > > V [libjvm.so+0x1b9a6c8] void \
> > > > > > os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x38
> > > > > > V [libjvm.so+0x177c90a] void \
> > > > > > JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x9a \
> > > > > > V [libjvm.so+0x177be70] void \
> > > > > > JavaCalls::call_virtual(JavaValue*,KlassHandle,Symbol*,Symbol*,JavaCallArguments*,Thread*)+0x250
> > > > > > V [libjvm.so+0x177bf56] void \
> > > > > > JavaCalls::call_virtual(JavaValue*,Handle,KlassHandle,Symbol*,Symbol*,Thread*)+0x66
> > > > > > V [libjvm.so+0x1896897] void thread_entry(JavaThread*,Thread*)+0xc7
> > > > > > V [libjvm.so+0x1d8f23e] void JavaThread::thread_main_inner()+0x18e
> > > > > > V [libjvm.so+0x1d8f09a] void JavaThread::run()+0x1fa
> > > > > > V [libjvm.so+0x1b8f3c8] java_start+0x248
> > > > > > C [libc.so.1+0x122105] _thrp_setup+0xa5
> > > > > > C [libc.so.1+0x1223b0] _lwp_start+0x0
> > >
>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic