On Fri, Nov 14, 2014 at 6:00 PM, Maynard Johnson <mayna...@us.ibm.com> wrote:
> On 10/07/2014 08:35 AM, Maynard Johnson wrote:
>> On 10/07/2014 03:58 AM, Volker Simonis wrote:
>>> Hi Maynard,
>>>
>>> I'm now back from JavaOne and can look at this issue. Could you please
>>> share your current implementation so I can reproduce your problem more
>>> easily.
>> See attachment.  The two patches in the attached tar file apply to a 
>> jdk9-dev snapshot from July.  I haven't even tried forward-porting to 
>> current upstream code, so I don't know how well they would apply.
>>>
>>> By the way, you can find the ppc frame layout description of all the
>>> different frame types (native, interpreted, compiled) in
>>> /hotspot/src/cpu/ppc/vm/frame_ppc.hpp. The different frame::sender()
>>> implementations (in frame_x86.cpp, frame_ppc.cpp, ..) contain all the
>> Yes, I've been studying those files, but I freely admit I don't have a good 
>> grasp of the code yet.
>>> gory details about how to walk a frame. That's what you have to
>>> implement in Java in order to get a full stack trace from the
>>> serviceability tools. On x86 the frame pointer (i.e. the ebp register
>>> points to the last frame pointer while (frame pointer - 1) points to
>>> the return pc.
>> Ummm . . . Stack addresses grow downward, and I was under the impression 
>> 'return pc' was the word on the stack directly before the ebp, which would 
>> mean return pc is at 'frame pointer + 1'. Or am I off base here?  
>> Nevertheless, my question below concerns the "pc", not the "return pc".  
>> Perhaps I'm misunderstanding "pc" in this context; but even so, the x86 code 
>> still seems wrong:
>>
>>       this.pc = raw_sp.getAddressAt(-1 * VM.getVM().getAddressSize());
>>
>> If, in fact, 'this.pc' is supposed to represent 'return pc' in this context, 
>> then I would think the code should be:
>>
>>       this.pc = raw_fp.getAddressAt(VM.getVM().getAddressSize());
>>
>> I hope you can help set me on the right track.  As you can see, I'm lost in 
>> the weeds right now.  :-)
> Hi, Volker,
> I presume you've been too busy to help out with this, so I had another go at 
> it, and was able to make
> quite a bit of progress.  The main issue was that I was unwittingly building 
> my openJDK source
> with the "--with-jvm-interpreter=cpp" configure option!  Once I discovered 
> that and removed that option,
> the stack started making sense, since my new ppc64 agent's reflection of the 
> stack assumes the use
> of the template interpreter (as does the x86 agent code which the ppc64 stuff 
> is based on).
>
> So now I have jmap, jsadebugd, and jstack working for ppc64 on both big 
> endian and little endian -- almost.
> There are a couple issues yet with jstack that I'm stuck on.  I will post the 
> patches as an RFC
> and document those issues.  If you could find time to review the patches and 
> perhaps help out with
> the open issues, I would appreciate it.  Thanks!
>

Hi Maynard,

sorry, I was quite busy indeed.
I'm really happy that you've made some progress in the meantime and I
promise to look at your changes next week.

Thank you and best regards,
Volker

> -Maynard
>>
>> -Maynard
>>>
>>> Regards,
>>> Volker
>>>
>>>
>>> On Tue, Sep 30, 2014 at 12:42 AM, Maynard Johnson <mayna...@us.ibm.com> 
>>> wrote:
>>>> On 07/09/2014 12:38 PM, Volker Simonis wrote:
>>>>> On Wed, Jul 9, 2014 at 3:45 PM, Maynard Johnson <mayna...@us.ibm.com> 
>>>>> wrote:
>>>>>> On 07/04/2014 10:59 AM, Volker Simonis wrote:
>>>>>>> Hi Maynard,
>>>>>>>
>>>>>>> we (i.e. SAP) do not currently support the SA agent on Linux/PPC64 and
>>>>>>> AIX (we have other proprietary servicibility tools). Because of that
>>>>>>> (and because SA isn't specified by the SE specification) porting the
>>>>>>> SA agent was no top priority until now. But there are no technical
>>>>>>> reasons why it should not work (it's just a lack of  resources). Of
>>>>>>> course contributions are always highly welcome:)
>>>>>>>
>>>>>>> That said, the SA agent library and jar file actually gets build. If
>>>>>>> you do a complete build you'll find them under:
>>>>>>>
>>>>>>> hotspot/linux_ppc64_compiler2/generated/sa-jdi.jar
>>>>>>> hotspot/linux_ppc64_compiler2/{product,fastdebug,debug}/libsaproc.so
>>>>>>>
>>>>>>> in the build directory. They are just not copied into the jdk
>>>>>>> workspace and the created images because they don't work out of the
>>>>>>> box.
>>>>>>>
>>>>>>> The following two patches for the jdk9 top-level and hotspot
>>>>>>> repositories respectively should fix the build such that the agent
>>>>>>> files will be correctly copied into the images.
>>>>>>>
>>>>>>> http://cr.openjdk.java.net/~simonis/webrevs/sa_toplevel
>>>>>>> http://cr.openjdk.java.net/~simonis/webrevs/sa_hotspot/
>>>>>>>
>>>>>>> They will get you to the point where for example 'jstack' will run up
>>>>>>> to the following point:
>>>>>> Ok, great.  This should be enough to get me started.  I should have time 
>>>>>> to begin on this later this week or early next week.
>>>>>
>>>>> Hi Maynard,
>>>>>
>>>>> great to welcome you in the ppc64 porting team:)
>>>>>
>>>>>> I may come knocking at your "door" for some occasional help, but I'll 
>>>>>> try to keep that to a minimum.
>>>> Hi, Volker.  Knock, knock.  :-)
>>>> I was preoccupied for a while this summer rolling out the latest release 
>>>> of oprofile (for which I'm the maintainer), but am now coming back to this 
>>>> task. I've implemented what I believe are all of the necessary 
>>>> ppc64-specific Java files to enable the jstack and jmap tools to work on 
>>>> core files.  I've also updated 
>>>> hotspot/agent/src/os/linux/LinuxDebuggerLocal.c to implement the 
>>>> accumulation of register data on ppc64 vi ptrace.  But now I've run into a 
>>>> problem I need help with.
>>>>
>>>> When I run jstack on my POWER7 system, it gets stuck in a loop in 
>>>> sun.jvm.hotspot.tools.StackTrace::run.  There's an inner for-loop there 
>>>> where cur.getLastJavaVFrameDbg() is called ('cur' is a JavaThread). For 
>>>> the first JavaThread, we do return from getLastJavaVFrameDbg(), just as we 
>>>> do when running jstack on my Intel laptop.  But for the second JavaThread, 
>>>> we never return from getLastJavaVFrameDbg() on ppc64.  I believe the root 
>>>> of the problem is in my new  sun.jvm.hotspot.runtime.ppc64.PPC64Frame 
>>>> class. The getLastJavaVFrameDbg method calls getCurrentFrameGuess, which 
>>>> is implemented in the new 
>>>> sun.jvm.hotspot.runtime.linux_ppc64.LinuxPPC64JavaThreadPDAccess class. In 
>>>> both ppc64 and x86, this first level xxxCurrentFrameGuess object is 
>>>> instantiated with a 'pc' value of null, so getCurrentFrameGuess then new's 
>>>> up a xxxFrame object, passing in the SP and FP, but no PC. The 
>>>> implementation of the PPC64Frame(Address,Address) constructor is currently 
>>>> identical to the X86Frame !
>  c!
>>  ons!
>>>>  tructor, b
>>>> ut is almost certainly incorrect. In this constructor, the 'pc' is set as 
>>>> follows:
>>>>          this.pc = raw_sp.getAddressAt(-1 * VM.getVM().getAddressSize());
>>>>
>>>> This works fine on X86, but not on ppc64. But I'm not understanding how 
>>>> this even works on X86. From what I understand, the data below the stack 
>>>> pointer on X86 is the "red zone". How is that being used as a pc? But more 
>>>> importantly, do you know how I can ascertain what the 'pc' value should be 
>>>> for ppc64?
>>>>
>>>> Thanks in advance for any assistance you can give.
>>>>
>>>> -Maynard
>>>>
>>>>>
>>>>> Please feel free to ask any questions. The OpenJDK project and
>>>>> especially the HotSpot part are known to take some getting used to.
>>>>>
>>>>>> I was wondering if a bug report should be opened in JBS, just to record 
>>>>>> that the issue is being worked.  Thoughts?
>>>>>
>>>>> I have opened "8049715: PPC64: First steps to enable SA on
>>>>> Linux/PPC64" (https://bugs.openjdk.java.net/browse/JDK-8049715) for
>>>>> the patch which I sent you with the last mail. I've already sent out
>>>>> webrevs for that change and hopefully it will be fixed within the next
>>>>> few days.
>>>>>
>>>>> For the actual port of the ppc64-specific stuff I opened bug "8049716
>>>>> PPC64: Implement SA on Linux/PPC64"
>>>>> (https://bugs.openjdk.java.net/browse/JDK-8049716). I can also help
>>>>> with hosting the webrevs, once you have a running version.
>>>>>
>>>>> Regards,
>>>>> Volker
>>>>>
>>>>>>
>>>>>> -Maynard
>>>>>>>
>>>>>>>> images/j2sdk-image/bin/jstack ./jdk/bin/java core.13547
>>>>>>> Attaching to core core.13547 from executable ./jdk/bin/java, please 
>>>>>>> wait...
>>>>>>> WARNING: Hotspot VM version
>>>>>>> 1.9.0-internal-debug-d046063_2014_07_04_11_46-b00 does not match with
>>>>>>> SA version 1.9.0-internal-debug-d046063_2014_07_04_11_46-b00. You may
>>>>>>> see unexpected results.
>>>>>>> Debugger attached successfully.
>>>>>>> Server compiler detected.
>>>>>>> JVM version is 1.9.0-internal-debug-d046063_2014_07_04_11_46-b00
>>>>>>> Deadlock Detection:
>>>>>>>
>>>>>>> Exception in thread "main" java.lang.reflect.InvocationTargetException
>>>>>>>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>>>>     at 
>>>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>>>>>>>     at 
>>>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>>>>>>     at java.lang.reflect.Method.invoke(Method.java:484)
>>>>>>>     at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
>>>>>>>     at sun.tools.jstack.JStack.main(JStack.java:106)
>>>>>>> Caused by: java.lang.ExceptionInInitializerError
>>>>>>>     at sun.jvm.hotspot.runtime.VM.getThreads(VM.java:610)
>>>>>>>     at 
>>>>>>> sun.jvm.hotspot.runtime.DeadlockDetector.print(DeadlockDetector.java:54)
>>>>>>>     at 
>>>>>>> sun.jvm.hotspot.runtime.DeadlockDetector.print(DeadlockDetector.java:39)
>>>>>>>     at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:62)
>>>>>>>     at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:45)
>>>>>>>     at sun.jvm.hotspot.tools.JStack.run(JStack.java:66)
>>>>>>>     at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260)
>>>>>>>     at sun.jvm.hotspot.tools.Tool.start(Tool.java:223)
>>>>>>>     at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
>>>>>>>     at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
>>>>>>>     ... 6 more
>>>>>>> Caused by: java.lang.RuntimeException: OS/CPU combination linux/ppc64
>>>>>>> not yet supported
>>>>>>>     at sun.jvm.hotspot.runtime.Threads.initialize(Threads.java:97)
>>>>>>>     at sun.jvm.hotspot.runtime.Threads.access$000(Threads.java:42)
>>>>>>>     at sun.jvm.hotspot.runtime.Threads$1.update(Threads.java:52)
>>>>>>>     at 
>>>>>>> sun.jvm.hotspot.runtime.VM.registerVMInitializedObserver(VM.java:394)
>>>>>>>     at sun.jvm.hotspot.runtime.Threads.<clinit>(Threads.java:50)
>>>>>>>     ... 16 more
>>>>>>>
>>>>>>> And that's the point where I was saying that "contributions are always
>>>>>>> highly welcome:)"
>>>>>>>
>>>>>>> Now all the Linux/PPC64 specific class under
>>>>>>> hotspot/agent/src/share/classes/ would have to be implemented (e.g.
>>>>>>> sun/jvm/hotspot/runtime/amd64/AMD64CurrentFrameGuess). Are you
>>>>>>> interested in contributing to this project?
>>>>>>>
>>>>>>> Regards,
>>>>>>> Volker
>>>>>>>
>>>>>>> PS: I cc-ed serviceability-dev because I remember that they started a
>>>>>>> poll a while ago about who is using the SA tools. I'm therefore not
>>>>>>> quite sure what's the current status and what are the future plan for
>>>>>>> these libraries.
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Jul 3, 2014 at 9:04 PM, Maynard Johnson <mayna...@us.ibm.com> 
>>>>>>> wrote:
>>>>>>>> Hi, all,
>>>>>>>> On my Intel laptop, I note that certain jdk9 serviceability tools -- 
>>>>>>>> jstack, jmap, jsadebugd -- have an option to pass a core file instead 
>>>>>>>> of a process ID; for example:
>>>>>>>>
>>>>>>>>         $ jstack -h
>>>>>>>>         Usage:
>>>>>>>>             jstack [-l] <pid>
>>>>>>>>                 (to connect to running process)
>>>>>>>>             jstack -F [-m] [-l] <pid>
>>>>>>>>                 (to connect to a hung process)
>>>>>>>>             jstack [-m] [-l] <executable> <core>
>>>>>>>>                 (to connect to a core file)
>>>>>>>>             jstack [-m] [-l] [server_id@]<remote server IP or hostname>
>>>>>>>>                 (to connect to a remote debug server)
>>>>>>>>
>>>>>>>> But on my PowerLinux box, the core file option is missing from the 
>>>>>>>> usage output.  I see that 
>>>>>>>> jdk9-dev/jdk/src/share/classes/sun/tools/jstack/JStack.java requires 
>>>>>>>> the existence of sun.jvm.hotspot.tools.JStack for the core file option 
>>>>>>>> to be made available.  On my Intel system, the 
>>>>>>>> sun.jvm.hotspot.tools.JStack class is packaged in sa-jdi.jar in 
>>>>>>>> <jdk9Dev-install>/jvm/openjdk-1.9.0-internal/lib/.  But the sa-jdi.jar 
>>>>>>>> is missing on PowerPC.  Is there a technical reason for this or is it 
>>>>>>>> an oversight?
>>>>>>>>
>>>>>>>> The jsadebugd tool does not run at all on PowerLinux; it gets the 
>>>>>>>> following error:
>>>>>>>>
>>>>>>>>         Error: Could not find or load main class 
>>>>>>>> sun.jvm.hotspot.jdi.SADebugServer
>>>>>>>>
>>>>>>>> On my Intel system, the SADebugServer class is packaged in the 
>>>>>>>> sa-jdi.jar mentioned above.
>>>>>>>>
>>>>>>>> I've spent the past day or so looking at makefiles until I'm 
>>>>>>>> cross-eyed, but haven't yet found where the issue might be.  Any tips 
>>>>>>>> would be appreciated.
>>>>>>>>
>>>>>>>> Thanks.
>>>>>>>> -Maynard
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to