alternate pns() debug function
Chris Plummer
chris.plummer at oracle.com
Tue Nov 7 05:05:57 UTC 2017
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.
Let me know what you think.
thanks,
Chris
More information about the hotspot-runtime-dev
mailing list