hotspot/src/share/vm/utilities/debug.cpp
changeset 6176 4d9030fe341f
parent 5547 f4b087cbb361
child 6445 64694b1e56e7
equal deleted inserted replaced
6175:86dbf3cacacc 6176:4d9030fe341f
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
   550   } else {
   550   } else {
   551     return (address)(intptr_t(y) & page_bits);
   551     return (address)(intptr_t(y) & page_bits);
   552   }
   552   }
   553 }
   553 }
   554 
   554 
   555 
       
   556 static void find(intptr_t x, bool print_pc) {
       
   557   address addr = (address)x;
       
   558 
       
   559   CodeBlob* b = CodeCache::find_blob_unsafe(addr);
       
   560   if (b != NULL) {
       
   561     if (b->is_buffer_blob()) {
       
   562       // the interpreter is generated into a buffer blob
       
   563       InterpreterCodelet* i = Interpreter::codelet_containing(addr);
       
   564       if (i != NULL) {
       
   565         i->print();
       
   566         return;
       
   567       }
       
   568       if (Interpreter::contains(addr)) {
       
   569         tty->print_cr(INTPTR_FORMAT " is pointing into interpreter code (not bytecode specific)", addr);
       
   570         return;
       
   571       }
       
   572       //
       
   573       if (AdapterHandlerLibrary::contains(b)) {
       
   574         AdapterHandlerLibrary::print_handler(b);
       
   575       }
       
   576       // the stubroutines are generated into a buffer blob
       
   577       StubCodeDesc* d = StubCodeDesc::desc_for(addr);
       
   578       if (d != NULL) {
       
   579         d->print();
       
   580         if (print_pc) tty->cr();
       
   581         return;
       
   582       }
       
   583       if (StubRoutines::contains(addr)) {
       
   584         tty->print_cr(INTPTR_FORMAT " is pointing to an (unnamed) stub routine", addr);
       
   585         return;
       
   586       }
       
   587       // the InlineCacheBuffer is using stubs generated into a buffer blob
       
   588       if (InlineCacheBuffer::contains(addr)) {
       
   589         tty->print_cr(INTPTR_FORMAT " is pointing into InlineCacheBuffer", addr);
       
   590         return;
       
   591       }
       
   592       VtableStub* v = VtableStubs::stub_containing(addr);
       
   593       if (v != NULL) {
       
   594         v->print();
       
   595         return;
       
   596       }
       
   597     }
       
   598     if (print_pc && b->is_nmethod()) {
       
   599       ResourceMark rm;
       
   600       tty->print("%#p: Compiled ", addr);
       
   601       ((nmethod*)b)->method()->print_value_on(tty);
       
   602       tty->print("  = (CodeBlob*)" INTPTR_FORMAT, b);
       
   603       tty->cr();
       
   604       return;
       
   605     }
       
   606     if ( b->is_nmethod()) {
       
   607       if (b->is_zombie()) {
       
   608         tty->print_cr(INTPTR_FORMAT " is zombie nmethod", b);
       
   609       } else if (b->is_not_entrant()) {
       
   610         tty->print_cr(INTPTR_FORMAT " is non-entrant nmethod", b);
       
   611       }
       
   612     }
       
   613     b->print();
       
   614     return;
       
   615   }
       
   616 
       
   617   if (Universe::heap()->is_in(addr)) {
       
   618     HeapWord* p = Universe::heap()->block_start(addr);
       
   619     bool print = false;
       
   620     // If we couldn't find it it just may mean that heap wasn't parseable
       
   621     // See if we were just given an oop directly
       
   622     if (p != NULL && Universe::heap()->block_is_obj(p)) {
       
   623       print = true;
       
   624     } else if (p == NULL && ((oopDesc*)addr)->is_oop()) {
       
   625       p = (HeapWord*) addr;
       
   626       print = true;
       
   627     }
       
   628     if (print) {
       
   629       oop(p)->print();
       
   630       if (p != (HeapWord*)x && oop(p)->is_constMethod() &&
       
   631           constMethodOop(p)->contains(addr)) {
       
   632         Thread *thread = Thread::current();
       
   633         HandleMark hm(thread);
       
   634         methodHandle mh (thread, constMethodOop(p)->method());
       
   635         if (!mh->is_native()) {
       
   636           tty->print_cr("bci_from(%p) = %d; print_codes():",
       
   637                         addr, mh->bci_from(address(x)));
       
   638           mh->print_codes();
       
   639         }
       
   640       }
       
   641       return;
       
   642     }
       
   643   } else if (Universe::heap()->is_in_reserved(addr)) {
       
   644     tty->print_cr(INTPTR_FORMAT " is an unallocated location in the heap", addr);
       
   645     return;
       
   646   }
       
   647 
       
   648   if (JNIHandles::is_global_handle((jobject) addr)) {
       
   649     tty->print_cr(INTPTR_FORMAT " is a global jni handle", addr);
       
   650     return;
       
   651   }
       
   652   if (JNIHandles::is_weak_global_handle((jobject) addr)) {
       
   653     tty->print_cr(INTPTR_FORMAT " is a weak global jni handle", addr);
       
   654     return;
       
   655   }
       
   656   if (JNIHandleBlock::any_contains((jobject) addr)) {
       
   657     tty->print_cr(INTPTR_FORMAT " is a local jni handle", addr);
       
   658     return;
       
   659   }
       
   660 
       
   661   for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) {
       
   662     // Check for privilege stack
       
   663     if (thread->privileged_stack_top() != NULL && thread->privileged_stack_top()->contains(addr)) {
       
   664       tty->print_cr(INTPTR_FORMAT " is pointing into the privilege stack for thread: " INTPTR_FORMAT, addr, thread);
       
   665       return;
       
   666     }
       
   667     // If the addr is a java thread print information about that.
       
   668     if (addr == (address)thread) {
       
   669        thread->print();
       
   670        return;
       
   671     }
       
   672   }
       
   673 
       
   674   // Try an OS specific find
       
   675   if (os::find(addr)) {
       
   676     return;
       
   677   }
       
   678 
       
   679   if (print_pc) {
       
   680     tty->print_cr(INTPTR_FORMAT ": probably in C++ code; check debugger", addr);
       
   681     Disassembler::decode(same_page(addr-40,addr),same_page(addr+40,addr));
       
   682     return;
       
   683   }
       
   684 
       
   685   tty->print_cr(INTPTR_FORMAT " is pointing to unknown location", addr);
       
   686 }
       
   687 
       
   688 
       
   689 class LookForRefInGenClosure : public OopsInGenClosure {
   555 class LookForRefInGenClosure : public OopsInGenClosure {
   690 public:
   556 public:
   691   oop target;
   557   oop target;
   692   void do_oop(oop* o) {
   558   void do_oop(oop* o) {
   693     if (o != NULL && *o == target) {
   559     if (o != NULL && *o == target) {
   765 
   631 
   766 // Another interface that isn't ambiguous in dbx.
   632 // Another interface that isn't ambiguous in dbx.
   767 // Can we someday rename the other find to hsfind?
   633 // Can we someday rename the other find to hsfind?
   768 extern "C" void hsfind(intptr_t x) {
   634 extern "C" void hsfind(intptr_t x) {
   769   Command c("hsfind");
   635   Command c("hsfind");
   770   find(x, false);
   636   os::print_location(tty, x, false);
   771 }
   637 }
   772 
   638 
   773 
   639 
   774 extern "C" void hsfindref(intptr_t x) {
   640 extern "C" void hsfindref(intptr_t x) {
   775   Command c("hsfindref");
   641   Command c("hsfindref");
   776   findref(x);
   642   findref(x);
   777 }
   643 }
   778 
   644 
   779 extern "C" void find(intptr_t x) {
   645 extern "C" void find(intptr_t x) {
   780   Command c("find");
   646   Command c("find");
   781   find(x, false);
   647   os::print_location(tty, x, false);
   782 }
   648 }
   783 
   649 
   784 
   650 
   785 extern "C" void findpc(intptr_t x) {
   651 extern "C" void findpc(intptr_t x) {
   786   Command c("findpc");
   652   Command c("findpc");
   787   find(x, true);
   653   os::print_location(tty, x, true);
   788 }
   654 }
   789 
   655 
   790 
   656 
   791 // int versions of all methods to avoid having to type type casts in the debugger
   657 // int versions of all methods to avoid having to type type casts in the debugger
   792 
   658