Thanks David!

/Staffan

On 1 feb 2013, at 06:05, David Holmes <david.hol...@oracle.com> wrote:

> Hi Staffan,
> 
> First, please refrain from doing code cleanup (long line reformatting) 
> alongside a fairly significant change - it makes the true changes harder to 
> spot. Thanks.
> 
> Based on our discussions this all looks good to me.
> 
> Thanks,
> David
> 
> On 18/01/2013 5:48 AM, Staffan Larsen wrote:
>> This is a request for review of a fix for SA on OS X.
>> 
>> webrev: http://cr.openjdk.java.net/~sla/8006423/webrev.00/
>> bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8006423
>> 
>> The bug report contains a detailed description of the problem and the 
>> proposed solution. I have copied some of that text below. To verify the fix 
>> I have manually run jstack on OS X.
>> 
>> Thanks,
>> /Staffan
>> 
>> 
>> 
>> In many cases when running the SA version of JStack (or other SA tools) an 
>> NPE is thrown in BsdThread.getContext(). The underlaying cause is that SA 
>> fails to read the context of the thread in the native method 
>> getThreadIntegerRegisterSet0() (thread_get_state returns an error).
>> 
>> The following is my understanding of what the cause is and a suggestion for 
>> a fix - my experience with OS X is a bit limited so I may be off on some 
>> details.
>> 
>> thread_get_state() takes a thread_t as a parameter. The value of this 
>> parameter comes from SA reading the value of the OSThread._thread_id field 
>> in the Hotspot process being debugged. This value is set in HotSpot to 
>> ::mach_thread_self() which is documented as "The mach_thread_self system 
>> call returns the calling thread's thread port."
>> 
>> My theory is that this "thread port" in not valid when a different process 
>> calls thread_get_state(). Instead, the other process (SA in this case) needs 
>> it's own "thread port" for the thread it wants to access.
>> 
>> There is a way to list all the thread ports in a different process (or 
>> "task" as they are called in Mach) via the task_threads() function.
>> 
>> So now we have the thread ports, we just need to correlate them with the C++ 
>> Thread objects in the Hotspot process. One way to do this correlation is via 
>> the stack pointer. We can get the current value of the stack pointer (rsp) 
>> in SA and look through all the Thread objects to see which one the stack 
>> pointer belongs to (by looking at Thread._stack_base and Thread._stack_size).
>> 
>> Another way seems to be to use the thread_info() function with the 
>> THREAD_IDENTIFIER_INFO parameter. This gives us a struct which has a field 
>> called thread_id. The comment for this field in the thread_info.h file says 
>> "system-wide unique 64-bit thread id". The value for this thread_id is the 
>> same when called from Hotspot and when called from the debugging process 
>> (SA), so this looks like a way to do the correlation.
>> 
>> This requires Hotspot to store this value in OSThread and SA to first list 
>> all the "thread ports", then find the thread_id for each one and select the 
>> right "thread port" for the thread we are looking for.
>> 
>> Using a thread_id provided by the system seems more reliable than using the 
>> stack pointer for correlation.
>> 
>> 

Reply via email to