alternate pns() debug function

Chris Plummer chris.plummer at oracle.com
Tue Nov 7 20:18:33 UTC 2017


On 11/6/17 11:20 PM, Ioi Lam wrote:
>
>
> On 11/6/17 9:05 PM, Chris Plummer wrote:
>> Hi,
>>
>> I'd like to add an alternate version of pns() to debug.cpp, and would 
>> like some initial comments first before filing a bug and sending out 
>> an RFR. pns() is used to print out the native stack:
>>
>> extern "C" void pns(void* sp, void* fp, void* pc) { // print native 
>> stack
>>   Command c("pns");
>>   static char buf[O_BUFLEN];
>>   Thread* t = Thread::current_or_null();
>>   // Call generic frame constructor (certain arguments may be ignored)
>>   frame fr(sp, fp, pc);
>>   VMError::print_native_stack(tty, fr, t, buf, sizeof(buf));
>> }
>>
>> And here's the help output for it:
>>
>>   pns(void* sp, void* fp, void* pc)  - print native (i.e. mixed) 
>> stack trace. E.g.");
>>                    pns($sp, $rbp, $pc) on Linux/amd64 and 
>> Solaris/amd64 or");
>>                    pns($sp, $ebp, $pc) on Linux/x86 or");
>>                    pns($sp, 0, $pc)    on Linux/ppc64 or");
>>                    pns($sp + 0x7ff, 0, $pc) on Solaris/SPARC");
>>                  - in gdb do 'set overload-resolution off' before 
>> calling pns()");
>>                  - in dbx do 'frame 1' before calling pns()");
>>
>> The intent is to call it from gdb, but it is potentially useful to 
>> call it from within hotspot when debugging. I'd like to propose the 
>> following alternative, since it does away with needing to pass in 
>> register values (not easy to do from C):
>>
>> extern "C" void pns2() { // print native stack
>>   Command c("pns2");
>>   static char buf[O_BUFLEN];
>>   Thread* t = Thread::current_or_null();
>>   frame fr = os::current_frame();
>>   VMError::print_native_stack(tty, fr, t, buf, sizeof(buf));
>> }
>>
>> I actually used this quite a bit with some recent debugging. There 
>> were places in hotspot where I wanted to know what the native stack 
>> looked like when called, and it was a lot easier to just add a call 
>> to pns2() than to setup the test to run in gdb. This seems to work on 
>> Linux/x64, macosx/64, and solaris/sparc. For some reason it crashes 
>> on Windows/x64, but I don't see any indication from the above help 
>> for pns() that it works on Windows/x64 anyway.
>>
>> #
>> # A fatal error has been detected by the Java Runtime Environment:
>> #
>> #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000003bcfae1466, 
>> pid=9872, tid=12212
>> #
>> # JRE version: Java(TM) SE Runtime Environment (10.0) (fastdebug 
>> build 10-internal+0-2017-11-07-0256309.chris.plummer.jdk10-hs)
>> # Java VM: Java HotSpot(TM) 64-Bit Server VM (fastdebug 
>> 10-internal+0-2017-11-07-0256309.chris.plummer.jdk10-hs, mixed mode, 
>> tiered, compressed oops, g1 gc, windows-amd64)
>> # Problematic frame:
>> # v  ~StubRoutines::get_previous_fp
>> #
>>
>> I'm starting to suspect that os::current_frame() normally is never 
>> even called on Windows (there are calls to it in the VmError code, 
>> but I suspect they are never triggered on Windows) and that 
>> StubRoutines::get_previous_fp() is not working on Windows, but I 
>> could be wrong.
>>
> Hi Chris,
>
> I like this new pns2() function.
>
> To make this work on Windows, you probably need to follow this pattern 
> in vmError.cpp.
>
>
>      if (os::platform_print_native_stack(st, _context, buf, 
> sizeof(buf))) {
>        // We have printed the native stack in platform-specific code
>        // Windows/x64 needs special handling.
>      } else {
>        frame fr = _context ? os::fetch_frame_from_context(_context)
>                            : os::current_frame();
>
>        print_native_stack(st, fr, _thread, buf, sizeof(buf));
>      }
Thanks for the tip. I'll give that a try. Looks like it's needed for AIX 
also.

Chris
>
> Thanks
> - Ioi
>
>> Let me know what you think.
>>
>> thanks,
>>
>> Chris
>>
>




More information about the hotspot-runtime-dev mailing list