Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 Feb 2011 18:07:18 -0500
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        freebsd-java@freebsd.org
Cc:        Pieter de Goeje <pieter@degoeje.nl>, Mike Jakubik <mike.jakubik@intertainservices.com>
Subject:   Re: [CFT] Update OpenJDK6 to b21
Message-ID:  <201102071807.21551.jkim@FreeBSD.org>
In-Reply-To: <201102041932.43679.jkim@FreeBSD.org>
References:  <201101261721.58069.jkim@FreeBSD.org> <201102032111.13479.jkim@FreeBSD.org> <201102041932.43679.jkim@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Friday 04 February 2011 07:32 pm, Jung-uk Kim wrote:
> On Thursday 03 February 2011 09:11 pm, Jung-uk Kim wrote:
> > On Thursday 03 February 2011 04:24 pm, Jung-uk Kim wrote:
> > > On Thursday 03 February 2011 01:09 pm, Mike Jakubik wrote:
> > > > On Wed, 2011-02-02 at 13:54 -0500, Jung-uk Kim wrote:
> > > > > Yeah, I actually fixed that.  Some patches were missing in
> > > > > b20 ports. 'jstack -m' should work, too. :-)
> > > > >
> > > > > Thanks for testing!
> > > >
> > > > Compiled OK and working with my applications OK. The jstack
> > > > -m option you mention however produces the following results
> > > > here:
> > > >
> > > > Attaching to process ID 84046, please wait...
> > > > Debugger attached successfully.
> > > > Server compiler detected.
> > > > JVM version is 19.0-b09
> > > > sun.jvm.hotspot.debugger.DebuggerException:
> > > > sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs
> > > > failed for a lwp
> > > > 	at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal
> > > > $BsdDebuggerLocalWorkerThread.execute(BsdDebuggerLocal.java:1
> > > >52 ) at
> > > > sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.getThreadIntege
> > > >rR eg is terSet(BsdDebuggerLocal.java:466) at
> > > > sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.j
> > > >av a: 65 ) at
> > > > sun.jvm.hotspot.runtime.bsd_amd64.BsdAMD64JavaThreadPDAccess.
> > > >ge tC ur rentFrameGuess(BsdAMD64JavaThreadPDAccess.java:92) at
> > > > sun.jvm.hotspot.runtime.JavaThread.getCurrentFrameGuess(JavaT
> > > >hr ea d. java:256) at
> > > > sun.jvm.hotspot.runtime.JavaThread.getLastJavaVFrameDbg(JavaT
> > > >hr ea d. java:218) at
> > > > sun.jvm.hotspot.tools.PStack.initJFrameCache(PStack.java:208)
> > > > at sun.jvm.hotspot.tools.PStack.run(PStack.java:66)
> > > > 	at sun.jvm.hotspot.tools.PStack.run(PStack.java:53)
> > > > 	at sun.jvm.hotspot.tools.PStack.run(PStack.java:48)
> > > > 	at sun.jvm.hotspot.tools.JStack.run(JStack.java:60)
> > > > 	at sun.jvm.hotspot.tools.Tool.start(Tool.java:221)
> > > > 	at sun.jvm.hotspot.tools.JStack.main(JStack.java:86)
> > > > 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
> > > > Method) at
> > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcces
> > > >so rI mp l.java:57) at
> > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMet
> > > >ho dA cc essorImpl.java:43) at
> > > > java.lang.reflect.Method.invoke(Method.java:616)
> > > > 	at sun.tools.jstack.JStack.runJStackTool(JStack.java:136)
> > > > 	at sun.tools.jstack.JStack.main(JStack.java:102)
> > >
> > > Yeah, I noticed that, too.  It seems it's getting bogus thread
> > > IDs. It'll take some time for me to figure out why, though. :-(
> >
> > Now I know why but it is a very complicated problem. :-(
> >
> > Basically, the culprit was difference between Linux and BSD,
> > mostly _thread_id and ptrace(2).  Linux has gettid(2), which
> > returns a (32-bit) pid_t type, and it is used for _thread_id. 
> > Linux code simply calls ptrace(PTRACE_GETREGS, ...) with it and
> > it works fine. However, BSD does not have gettid(), so we used
> > pthread_t instead. Alas, we copied process_get_lwp_regs() from
> > Linux-specific file. It does not work for us because _thread_id
> > is a pthread_t type and ptrace() does not understand it. 
> > Unfortunately, there is no easy way to map pthread_t to a lwpid_t
> > value, either.  More worse, it gets truncated to 32-bit on amd64.
> >  Grrr...
>
> To prove my idea, I just implemented libthr function
> pthread_getthreadid_np():
>
> http://docs.freebsd.org/cgi/mid.cgi?201102041409.12314.jkim
>
> Updated ports to support this new feature:
>
> http://people.freebsd.org/~jkim/ports-openjdk6-b21_3.tar.bz2
>
> Since it is extremely experimental, it is turned off by default, of
> course.  If you dare to try it out, you must update libthr with the
> above libthr patch and forcefully define
> HAVE_PTHREAD_GETTHREADID_NP in the ports Makefile.  Now jstack can
> trace Java threads properly for me. :-)

Please try this:

http://people.freebsd.org/~jkim/ports-openjdk6-b21_4.tar.bz2

FYI, (simplified) libthr patch mentioned above was committed on HEAD.  
However, when pthread_getthreadid_np(3) is not available, now it uses 
(undocumented) thr_self() to get the same info.  So, there is no need 
to patch libthr any more. :-)

Thanks!

Jung-uk Kim



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201102071807.21551.jkim>