Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 59 additions & 18 deletions src/hotspot/share/utilities/debug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -296,20 +296,49 @@ void report_java_out_of_memory(const char* message) {

class Command : public StackObj {
private:
ResourceMark _rm;
static int level;
DebuggingContext _debugging;
bool _has_rm;
// ResourceMark is only created if a Thread or a JavaThread is required,
// and we are actually on a Thread.
union { ResourceMark _rm; };
public:
static int level;
Command(const char* str) {
if (level++ > 0) return;
tty->cr();
tty->print_cr("\"Executing %s\"", str);
Command(const char* str) : _has_rm(false) {
if (level++ == 0) {
tty->cr();
tty->print_cr("\"Executing %s\"", str);
}
tty->flush();
}

~Command() {
if (_has_rm) _rm.~ResourceMark();
tty->flush();
level--;
}

bool onThread() {
Thread* thread = Thread::current_or_null();
if (thread == nullptr) {
tty->print_cr("Failed: Current thread is not attached");
return false;
}

if (!_has_rm) {
::new (&_rm) ResourceMark();
_has_rm = true;
}
return true;
}

bool onJavaThread() {
if (!onThread()) return false;

if (JavaThread::active() == nullptr) {
tty->print_cr("Failed: Current thread is not a java thread or the vm thread");
return false;
}
return true;
}
};

int Command::level = 0;
Expand Down Expand Up @@ -370,6 +399,7 @@ extern "C" DEBUGEXPORT void printnm(intptr_t p) {

extern "C" DEBUGEXPORT void universe() {
Command c("universe");
if (!c.onThread()) return;
Universe::print_on(tty);
}

Expand All @@ -379,6 +409,7 @@ extern "C" DEBUGEXPORT void verify() {
// note: this may not be safe if we're not at a safepoint; for debugging,
// this manipulates the safepoint settings to avoid assertion failures
Command c("universe verify");
if (!c.onThread()) return;
bool safe = SafepointSynchronize::is_at_safepoint();
if (!safe) {
tty->print_cr("warning: not at safepoint -- verify may fail");
Expand All @@ -393,6 +424,7 @@ extern "C" DEBUGEXPORT void verify() {

extern "C" DEBUGEXPORT void pp(void* p) {
Command c("pp");
if (!c.onThread()) return;
FlagSetting fl(DisplayVMOutput, true);
if (p == nullptr) {
tty->print_cr("null");
Expand All @@ -419,8 +451,8 @@ extern "C" DEBUGEXPORT void pp(void* p) {
extern "C" DEBUGEXPORT void findpc(intptr_t x);

extern "C" DEBUGEXPORT void ps() { // print stack
if (Thread::current_or_null() == nullptr) return;
Command c("ps");
if (!c.onJavaThread()) return;

// Prints the stack of the current Java thread
JavaThread* p = JavaThread::active();
Expand Down Expand Up @@ -450,6 +482,7 @@ extern "C" DEBUGEXPORT void ps() { // print stack
extern "C" DEBUGEXPORT void pfl() {
// print frame layout
Command c("pfl");
if (!c.onJavaThread()) return;
JavaThread* p = JavaThread::active();
tty->print(" for thread: ");
p->print();
Expand All @@ -460,34 +493,36 @@ extern "C" DEBUGEXPORT void pfl() {
}

extern "C" DEBUGEXPORT void psf() { // print stack frames
{
Command c("psf");
JavaThread* p = JavaThread::active();
tty->print(" for thread: ");
p->print();
tty->cr();
if (p->has_last_Java_frame()) {
p->trace_frames();
}
Command c("psf");
if (!c.onJavaThread()) return;
JavaThread* p = JavaThread::active();
tty->print(" for thread: ");
p->print();
tty->cr();
if (p->has_last_Java_frame()) {
p->trace_frames();
}
}


extern "C" DEBUGEXPORT void threads() {
Command c("threads");
if (!c.onThread()) return;
Threads::print(false, true);
}


extern "C" DEBUGEXPORT void psd() {
Command c("psd");
if (!c.onThread()) return;

SystemDictionary::print();
}


extern "C" DEBUGEXPORT void pss() { // print all stacks
if (Thread::current_or_null() == nullptr) return;
Command c("pss");
if (!c.onThread()) return;
Threads::print(true, PRODUCT_ONLY(false) NOT_PRODUCT(true));
}

Expand Down Expand Up @@ -534,12 +569,14 @@ extern "C" DEBUGEXPORT nmethod* findnm(intptr_t addr) {

extern "C" DEBUGEXPORT void find(intptr_t x) {
Command c("find");
if (!c.onThread()) return;
os::print_location(tty, x, false);
}


extern "C" DEBUGEXPORT void findpc(intptr_t x) {
Command c("findpc");
if (!c.onThread()) return;
os::print_location(tty, x, true);
}

Expand All @@ -551,13 +588,15 @@ extern "C" DEBUGEXPORT void findpc(intptr_t x) {
// call findmethod("*ang/Object*", "wait:(*J*)V", 0x1) -> list all "wait" methods in j.l.Object that have a long parameter
extern "C" DEBUGEXPORT void findclass(const char* class_name_pattern, int flags) {
Command c("findclass");
if (!c.onThread()) return;
ClassPrinter::print_flags_help(tty);
ClassPrinter::print_classes(class_name_pattern, flags, tty);
}

extern "C" DEBUGEXPORT void findmethod(const char* class_name_pattern,
const char* method_pattern, int flags) {
Command c("findmethod");
if (!c.onThread()) return;
ClassPrinter::print_flags_help(tty);
ClassPrinter::print_methods(class_name_pattern, method_pattern, flags, tty);
}
Expand Down Expand Up @@ -644,6 +683,7 @@ void help() {
#ifndef PRODUCT
extern "C" DEBUGEXPORT void pns(void* sp, void* fp, void* pc) { // print native stack
Command c("pns");
if (!c.onThread()) return;
static char buf[O_BUFLEN];
// Call generic frame constructor (certain arguments may be ignored)
frame fr(sp, fp, pc);
Expand All @@ -662,6 +702,7 @@ extern "C" DEBUGEXPORT void pns(void* sp, void* fp, void* pc) { // print native
//
extern "C" DEBUGEXPORT void pns2() { // print native stack
Command c("pns2");
if (!c.onThread()) return;
static char buf[O_BUFLEN];
address lastpc = nullptr;
NativeStackPrinter nsp(Thread::current_or_null());
Expand Down