Skip to content
Closed
Changes from 4 commits
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
83 changes: 63 additions & 20 deletions src/hotspot/share/utilities/debug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
#include "utilities/unsigned5.hpp"
#include "utilities/vmError.hpp"

#include <new>
#include <stdarg.h>
#include <stdio.h>

Expand Down Expand Up @@ -296,20 +297,39 @@ 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;
}
};

int Command::level = 0;
Expand Down Expand Up @@ -370,6 +390,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 +400,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 +415,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,11 +442,14 @@ 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");

// Prints the stack of the current Java thread
Command c("ps");
if (!c.onThread()) return;
JavaThread* p = JavaThread::active();
if (p == nullptr) {
tty->print_cr("Failed: JavaThread::active is null");
return;
}
tty->print(" for thread: ");
p->print();
tty->cr();
Expand All @@ -450,7 +476,12 @@ extern "C" DEBUGEXPORT void ps() { // print stack
extern "C" DEBUGEXPORT void pfl() {
// print frame layout
Command c("pfl");
if (!c.onThread()) return;
JavaThread* p = JavaThread::active();
if (p == nullptr) {
tty->print_cr("Failed: JavaThread::active is null");
return;
}
tty->print(" for thread: ");
p->print();
tty->cr();
Expand All @@ -460,34 +491,40 @@ 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.onThread()) return;
JavaThread* p = JavaThread::active();
if (p == nullptr) {
tty->print_cr("Failed: JavaThread::active is null");
return;
}
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 +571,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 +590,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 +685,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 +704,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