[CFT] Update OpenJDK6 to b21

Jung-uk Kim jkim at FreeBSD.org
Sat Feb 5 00:32:52 UTC 2011


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:152
> > >) at
> > > sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.getThreadIntegerR
> > >eg is terSet(BsdDebuggerLocal.java:466) at
> > > sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.jav
> > >a: 65 ) at
> > > sun.jvm.hotspot.runtime.bsd_amd64.BsdAMD64JavaThreadPDAccess.ge
> > >tC ur rentFrameGuess(BsdAMD64JavaThreadPDAccess.java:92) at
> > > sun.jvm.hotspot.runtime.JavaThread.getCurrentFrameGuess(JavaThr
> > >ea d. java:256) at
> > > sun.jvm.hotspot.runtime.JavaThread.getLastJavaVFrameDbg(JavaThr
> > >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(NativeMethodAccesso
> > >rI mp l.java:57) at
> > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMetho
> > >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. :-)

Cheers,

Jung-uk Kim


More information about the freebsd-java mailing list