1 /* 2 * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 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 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "classfile/systemDictionary.hpp" 27 #include "code/codeCache.hpp" 28 #include "code/icBuffer.hpp" 29 #include "code/nmethod.hpp" 30 #include "code/vtableStubs.hpp" 31 #include "compiler/compileBroker.hpp" 32 #include "compiler/disassembler.hpp" 33 #include "gc/shared/collectedHeap.hpp" 34 #include "interpreter/bytecodeHistogram.hpp" 35 #include "interpreter/interpreter.hpp" 36 #include "memory/resourceArea.hpp" 37 #include "memory/universe.hpp" 38 #include "oops/oop.inline.hpp" 39 #include "prims/privilegedStack.hpp" 40 #include "runtime/arguments.hpp" 41 #include "runtime/atomic.hpp" 42 #include "runtime/frame.hpp" 43 #include "runtime/java.hpp" 44 #include "runtime/os.hpp" 45 #include "runtime/sharedRuntime.hpp" 46 #include "runtime/stubCodeGenerator.hpp" 47 #include "runtime/stubRoutines.hpp" 48 #include "runtime/thread.inline.hpp" 49 #include "runtime/vframe.hpp" 50 #include "runtime/vm_version.hpp" 51 #include "services/heapDumper.hpp" 52 #include "utilities/defaultStream.hpp" 53 #include "utilities/events.hpp" 54 #include "utilities/macros.hpp" 55 #include "utilities/vmError.hpp" 56 57 #include <stdio.h> 58 59 #ifndef ASSERT 60 # ifdef _DEBUG 61 // NOTE: don't turn the lines below into a comment -- if you're getting 62 // a compile error here, change the settings to define ASSERT 63 ASSERT should be defined when _DEBUG is defined. It is not intended to be used for debugging 64 functions that do not slow down the system too much and thus can be left in optimized code. 65 On the other hand, the code should not be included in a production version. 66 # endif // _DEBUG 67 #endif // ASSERT 68 69 70 #ifdef _DEBUG 71 # ifndef ASSERT 72 configuration error: ASSERT must be defined in debug version 73 # endif // ASSERT 74 #endif // _DEBUG 75 76 77 #ifdef PRODUCT 78 # if -defined _DEBUG || -defined ASSERT 79 configuration error: ASSERT et al. must not be defined in PRODUCT version 80 # endif 81 #endif // PRODUCT 82 83 FormatBufferResource::FormatBufferResource(const char * format, ...) 84 : FormatBufferBase((char*)resource_allocate_bytes(FormatBufferBase::BufferSize)) { 85 va_list argp; 86 va_start(argp, format); 87 jio_vsnprintf(_buf, FormatBufferBase::BufferSize, format, argp); 88 va_end(argp); 89 } 90 91 ATTRIBUTE_PRINTF(1, 2) 92 void warning(const char* format, ...) { 93 if (PrintWarnings) { 94 FILE* const err = defaultStream::error_stream(); 95 jio_fprintf(err, "%s warning: ", VM_Version::vm_name()); 96 va_list ap; 97 va_start(ap, format); 98 vfprintf(err, format, ap); 99 va_end(ap); 100 fputc('\n', err); 101 } 102 if (BreakAtWarning) BREAKPOINT; 103 } 104 105 #ifndef PRODUCT 106 107 #define is_token_break(ch) (isspace(ch) || (ch) == ',') 108 109 static const char* last_file_name = NULL; 110 static int last_line_no = -1; 111 112 // assert/guarantee/... may happen very early during VM initialization. 113 // Don't rely on anything that is initialized by Threads::create_vm(). For 114 // example, don't use tty. 115 bool error_is_suppressed(const char* file_name, int line_no) { 116 // The following 1-element cache requires that passed-in 117 // file names are always only constant literals. 118 if (file_name == last_file_name && line_no == last_line_no) return true; 119 120 int file_name_len = (int)strlen(file_name); 121 char separator = os::file_separator()[0]; 122 const char* base_name = strrchr(file_name, separator); 123 if (base_name == NULL) 124 base_name = file_name; 125 126 // scan the SuppressErrorAt option 127 const char* cp = SuppressErrorAt; 128 for (;;) { 129 const char* sfile; 130 int sfile_len; 131 int sline; 132 bool noisy; 133 while ((*cp) != '\0' && is_token_break(*cp)) cp++; 134 if ((*cp) == '\0') break; 135 sfile = cp; 136 while ((*cp) != '\0' && !is_token_break(*cp) && (*cp) != ':') cp++; 137 sfile_len = cp - sfile; 138 if ((*cp) == ':') cp++; 139 sline = 0; 140 while ((*cp) != '\0' && isdigit(*cp)) { 141 sline *= 10; 142 sline += (*cp) - '0'; 143 cp++; 144 } 145 // "file:line!" means the assert suppression is not silent 146 noisy = ((*cp) == '!'); 147 while ((*cp) != '\0' && !is_token_break(*cp)) cp++; 148 // match the line 149 if (sline != 0) { 150 if (sline != line_no) continue; 151 } 152 // match the file 153 if (sfile_len > 0) { 154 const char* look = file_name; 155 const char* look_max = file_name + file_name_len - sfile_len; 156 const char* foundp; 157 bool match = false; 158 while (!match 159 && (foundp = strchr(look, sfile[0])) != NULL 160 && foundp <= look_max) { 161 match = true; 162 for (int i = 1; i < sfile_len; i++) { 163 if (sfile[i] != foundp[i]) { 164 match = false; 165 break; 166 } 167 } 168 look = foundp + 1; 169 } 170 if (!match) continue; 171 } 172 // got a match! 173 if (noisy) { 174 fdStream out(defaultStream::output_fd()); 175 out.print_raw("[error suppressed at "); 176 out.print_raw(base_name); 177 char buf[16]; 178 jio_snprintf(buf, sizeof(buf), ":%d]", line_no); 179 out.print_raw_cr(buf); 180 } else { 181 // update 1-element cache for fast silent matches 182 last_file_name = file_name; 183 last_line_no = line_no; 184 } 185 return true; 186 } 187 188 if (!is_error_reported() && !SuppressFatalErrorMessage) { 189 // print a friendly hint: 190 fdStream out(defaultStream::output_fd()); 191 out.print_raw_cr("# To suppress the following error report, specify this argument"); 192 out.print_raw ("# after -XX: or in .hotspotrc: SuppressErrorAt="); 193 out.print_raw (base_name); 194 char buf[16]; 195 jio_snprintf(buf, sizeof(buf), ":%d", line_no); 196 out.print_raw_cr(buf); 197 } 198 return false; 199 } 200 201 #undef is_token_break 202 203 #else 204 205 // Place-holder for non-existent suppression check: 206 #define error_is_suppressed(file_name, line_no) (false) 207 208 #endif // !PRODUCT 209 210 void report_vm_error(const char* file, int line, const char* error_msg) 211 { 212 report_vm_error(file, line, error_msg, "%s", ""); 213 } 214 215 void report_vm_error(const char* file, int line, const char* error_msg, const char* detail_fmt, ...) 216 { 217 if (Debugging || error_is_suppressed(file, line)) return; 218 va_list detail_args; 219 va_start(detail_args, detail_fmt); 220 VMError::report_and_die(Thread::current_or_null(), file, line, error_msg, detail_fmt, detail_args); 221 va_end(detail_args); 222 } 223 224 void report_vm_status_error(const char* file, int line, const char* error_msg, 225 int status, const char* detail) { 226 report_vm_error(file, line, error_msg, "error %s(%d), %s", os::errno_name(status), status, detail); 227 } 228 229 void report_fatal(const char* file, int line, const char* detail_fmt, ...) 230 { 231 if (Debugging || error_is_suppressed(file, line)) return; 232 va_list detail_args; 233 va_start(detail_args, detail_fmt); 234 VMError::report_and_die(Thread::current_or_null(), file, line, "fatal error", detail_fmt, detail_args); 235 va_end(detail_args); 236 } 237 238 void report_vm_out_of_memory(const char* file, int line, size_t size, 239 VMErrorType vm_err_type, const char* detail_fmt, ...) { 240 if (Debugging) return; 241 va_list detail_args; 242 va_start(detail_args, detail_fmt); 243 VMError::report_and_die(Thread::current_or_null(), file, line, size, vm_err_type, detail_fmt, detail_args); 244 va_end(detail_args); 245 246 // The UseOSErrorReporting option in report_and_die() may allow a return 247 // to here. If so then we'll have to figure out how to handle it. 248 guarantee(false, "report_and_die() should not return here"); 249 } 250 251 void report_should_not_call(const char* file, int line) { 252 report_vm_error(file, line, "ShouldNotCall()"); 253 } 254 255 void report_should_not_reach_here(const char* file, int line) { 256 report_vm_error(file, line, "ShouldNotReachHere()"); 257 } 258 259 void report_unimplemented(const char* file, int line) { 260 report_vm_error(file, line, "Unimplemented()"); 261 } 262 263 #ifdef ASSERT 264 bool is_executing_unit_tests() { 265 return ExecutingUnitTests; 266 } 267 268 void report_assert_msg(const char* msg, ...) { 269 va_list ap; 270 va_start(ap, msg); 271 272 fprintf(stderr, "assert failed: %s\n", err_msg(FormatBufferDummy(), msg, ap).buffer()); 273 274 va_end(ap); 275 } 276 #endif // ASSERT 277 278 void report_untested(const char* file, int line, const char* message) { 279 #ifndef PRODUCT 280 warning("Untested: %s in %s: %d\n", message, file, line); 281 #endif // !PRODUCT 282 } 283 284 void report_java_out_of_memory(const char* message) { 285 static jint out_of_memory_reported = 0; 286 287 // A number of threads may attempt to report OutOfMemoryError at around the 288 // same time. To avoid dumping the heap or executing the data collection 289 // commands multiple times we just do it once when the first threads reports 290 // the error. 291 if (Atomic::cmpxchg(1, &out_of_memory_reported, 0) == 0) { 292 // create heap dump before OnOutOfMemoryError commands are executed 293 if (HeapDumpOnOutOfMemoryError) { 294 tty->print_cr("java.lang.OutOfMemoryError: %s", message); 295 HeapDumper::dump_heap_from_oome(); 296 } 297 298 if (OnOutOfMemoryError && OnOutOfMemoryError[0]) { 299 VMError::report_java_out_of_memory(message); 300 } 301 302 if (CrashOnOutOfMemoryError) { 303 tty->print_cr("Aborting due to java.lang.OutOfMemoryError: %s", message); 304 fatal("OutOfMemory encountered: %s", message); 305 } 306 307 if (ExitOnOutOfMemoryError) { 308 tty->print_cr("Terminating due to java.lang.OutOfMemoryError: %s", message); 309 os::exit(3); 310 } 311 } 312 } 313 314 static bool error_reported = false; 315 316 // call this when the VM is dying--it might loosen some asserts 317 void set_error_reported() { 318 error_reported = true; 319 } 320 321 bool is_error_reported() { 322 return error_reported; 323 } 324 325 #ifndef PRODUCT 326 #include <signal.h> 327 328 typedef void (*voidfun_t)(); 329 // Crash with an authentic sigfpe 330 static void crash_with_sigfpe() { 331 // generate a native synchronous SIGFPE where possible; 332 // if that did not cause a signal (e.g. on ppc), just 333 // raise the signal. 334 volatile int x = 0; 335 volatile int y = 1/x; 336 #ifndef _WIN32 337 // OSX implements raise(sig) incorrectly so we need to 338 // explicitly target the current thread 339 pthread_kill(pthread_self(), SIGFPE); 340 #endif 341 } // end: crash_with_sigfpe 342 343 // crash with sigsegv at non-null address. 344 static void crash_with_segfault() { 345 346 char* const crash_addr = (char*) get_segfault_address(); 347 *crash_addr = 'X'; 348 349 } // end: crash_with_segfault 350 351 // returns an address which is guaranteed to generate a SIGSEGV on read, 352 // for test purposes, which is not NULL and contains bits in every word 353 void* get_segfault_address() { 354 return (void*) 355 #ifdef _LP64 356 0xABC0000000000ABCULL; 357 #else 358 0x00000ABC; 359 #endif 360 } 361 362 void test_error_handler() { 363 controlled_crash(ErrorHandlerTest); 364 } 365 366 void controlled_crash(int how) { 367 if (how == 0) return; 368 369 // If asserts are disabled, use the corresponding guarantee instead. 370 NOT_DEBUG(if (how <= 2) how += 2); 371 372 const char* const str = "hello"; 373 const size_t num = (size_t)os::vm_page_size(); 374 375 const char* const eol = os::line_separator(); 376 const char* const msg = "this message should be truncated during formatting"; 377 char * const dataPtr = NULL; // bad data pointer 378 const void (*funcPtr)(void) = (const void(*)()) 0xF; // bad function pointer 379 380 // Keep this in sync with test/runtime/ErrorHandling/ErrorHandler.java 381 switch (how) { 382 case 1: vmassert(str == NULL, "expected null"); 383 case 2: vmassert(num == 1023 && *str == 'X', 384 "num=" SIZE_FORMAT " str=\"%s\"", num, str); 385 case 3: guarantee(str == NULL, "expected null"); 386 case 4: guarantee(num == 1023 && *str == 'X', 387 "num=" SIZE_FORMAT " str=\"%s\"", num, str); 388 case 5: fatal("expected null"); 389 case 6: fatal("num=" SIZE_FORMAT " str=\"%s\"", num, str); 390 case 7: fatal("%s%s# %s%s# %s%s# %s%s# %s%s# " 391 "%s%s# %s%s# %s%s# %s%s# %s%s# " 392 "%s%s# %s%s# %s%s# %s%s# %s", 393 msg, eol, msg, eol, msg, eol, msg, eol, msg, eol, 394 msg, eol, msg, eol, msg, eol, msg, eol, msg, eol, 395 msg, eol, msg, eol, msg, eol, msg, eol, msg); 396 case 8: vm_exit_out_of_memory(num, OOM_MALLOC_ERROR, "ChunkPool::allocate"); 397 case 9: ShouldNotCallThis(); 398 case 10: ShouldNotReachHere(); 399 case 11: Unimplemented(); 400 // There's no guarantee the bad data pointer will crash us 401 // so "break" out to the ShouldNotReachHere(). 402 case 12: *dataPtr = '\0'; break; 403 // There's no guarantee the bad function pointer will crash us 404 // so "break" out to the ShouldNotReachHere(). 405 case 13: (*funcPtr)(); break; 406 case 14: crash_with_segfault(); break; 407 case 15: crash_with_sigfpe(); break; 408 409 default: tty->print_cr("ERROR: %d: unexpected test_num value.", how); 410 } 411 ShouldNotReachHere(); 412 } 413 #endif // !PRODUCT 414 415 // ------ helper functions for debugging go here ------------ 416 417 // All debug entries should be wrapped with a stack allocated 418 // Command object. It makes sure a resource mark is set and 419 // flushes the logfile to prevent file sharing problems. 420 421 class Command : public StackObj { 422 private: 423 ResourceMark rm; 424 ResetNoHandleMark rnhm; 425 HandleMark hm; 426 bool debug_save; 427 public: 428 static int level; 429 Command(const char* str) { 430 debug_save = Debugging; 431 Debugging = true; 432 if (level++ > 0) return; 433 tty->cr(); 434 tty->print_cr("\"Executing %s\"", str); 435 } 436 437 ~Command() { 438 tty->flush(); 439 Debugging = debug_save; 440 level--; 441 } 442 }; 443 444 int Command::level = 0; 445 446 #ifndef PRODUCT 447 448 extern "C" void blob(CodeBlob* cb) { 449 Command c("blob"); 450 cb->print(); 451 } 452 453 454 extern "C" void dump_vtable(address p) { 455 Command c("dump_vtable"); 456 Klass* k = (Klass*)p; 457 k->vtable().print(); 458 } 459 460 461 extern "C" void nm(intptr_t p) { 462 // Actually we look through all CodeBlobs (the nm name has been kept for backwards compatability) 463 Command c("nm"); 464 CodeBlob* cb = CodeCache::find_blob((address)p); 465 if (cb == NULL) { 466 tty->print_cr("NULL"); 467 } else { 468 cb->print(); 469 } 470 } 471 472 473 extern "C" void disnm(intptr_t p) { 474 Command c("disnm"); 475 CodeBlob* cb = CodeCache::find_blob((address) p); 476 if (cb != NULL) { 477 nmethod* nm = cb->as_nmethod_or_null(); 478 if (nm != NULL) { 479 nm->print(); 480 } else { 481 cb->print(); 482 } 483 Disassembler::decode(cb); 484 } 485 } 486 487 488 extern "C" void printnm(intptr_t p) { 489 char buffer[256]; 490 sprintf(buffer, "printnm: " INTPTR_FORMAT, p); 491 Command c(buffer); 492 CodeBlob* cb = CodeCache::find_blob((address) p); 493 if (cb->is_nmethod()) { 494 nmethod* nm = (nmethod*)cb; 495 nm->print_nmethod(true); 496 } 497 } 498 499 500 extern "C" void universe() { 501 Command c("universe"); 502 Universe::print_on(tty); 503 } 504 505 506 extern "C" void verify() { 507 // try to run a verify on the entire system 508 // note: this may not be safe if we're not at a safepoint; for debugging, 509 // this manipulates the safepoint settings to avoid assertion failures 510 Command c("universe verify"); 511 bool safe = SafepointSynchronize::is_at_safepoint(); 512 if (!safe) { 513 tty->print_cr("warning: not at safepoint -- verify may fail"); 514 SafepointSynchronize::set_is_at_safepoint(); 515 } 516 // Ensure Eden top is correct before verification 517 Universe::heap()->prepare_for_verify(); 518 Universe::verify(); 519 if (!safe) SafepointSynchronize::set_is_not_at_safepoint(); 520 } 521 522 523 extern "C" void pp(void* p) { 524 Command c("pp"); 525 FlagSetting fl(PrintVMMessages, true); 526 FlagSetting f2(DisplayVMOutput, true); 527 if (Universe::heap()->is_in(p)) { 528 oop obj = oop(p); 529 obj->print(); 530 } else { 531 tty->print(PTR_FORMAT, p2i(p)); 532 } 533 } 534 535 536 // pv: print vm-printable object 537 extern "C" void pa(intptr_t p) { ((AllocatedObj*) p)->print(); } 538 extern "C" void findpc(intptr_t x); 539 540 #endif // !PRODUCT 541 542 extern "C" void ps() { // print stack 543 if (Thread::current_or_null() == NULL) return; 544 Command c("ps"); 545 546 547 // Prints the stack of the current Java thread 548 JavaThread* p = JavaThread::active(); 549 tty->print(" for thread: "); 550 p->print(); 551 tty->cr(); 552 553 if (p->has_last_Java_frame()) { 554 // If the last_Java_fp is set we are in C land and 555 // can call the standard stack_trace function. 556 #ifdef PRODUCT 557 p->print_stack(); 558 } else { 559 tty->print_cr("Cannot find the last Java frame, printing stack disabled."); 560 #else // !PRODUCT 561 p->trace_stack(); 562 } else { 563 frame f = os::current_frame(); 564 RegisterMap reg_map(p); 565 f = f.sender(®_map); 566 tty->print("(guessing starting frame id=" PTR_FORMAT " based on current fp)\n", p2i(f.id())); 567 p->trace_stack_from(vframe::new_vframe(&f, ®_map, p)); 568 pd_ps(f); 569 #endif // PRODUCT 570 } 571 572 } 573 574 extern "C" void pfl() { 575 // print frame layout 576 Command c("pfl"); 577 JavaThread* p = JavaThread::active(); 578 tty->print(" for thread: "); 579 p->print(); 580 tty->cr(); 581 if (p->has_last_Java_frame()) { 582 p->print_frame_layout(); 583 } 584 } 585 586 #ifndef PRODUCT 587 588 extern "C" void psf() { // print stack frames 589 { 590 Command c("psf"); 591 JavaThread* p = JavaThread::active(); 592 tty->print(" for thread: "); 593 p->print(); 594 tty->cr(); 595 if (p->has_last_Java_frame()) { 596 p->trace_frames(); 597 } 598 } 599 } 600 601 602 extern "C" void threads() { 603 Command c("threads"); 604 Threads::print(false, true); 605 } 606 607 608 extern "C" void psd() { 609 Command c("psd"); 610 SystemDictionary::print(); 611 } 612 613 614 extern "C" void safepoints() { 615 Command c("safepoints"); 616 SafepointSynchronize::print_state(); 617 } 618 619 #endif // !PRODUCT 620 621 extern "C" void pss() { // print all stacks 622 if (Thread::current_or_null() == NULL) return; 623 Command c("pss"); 624 Threads::print(true, PRODUCT_ONLY(false) NOT_PRODUCT(true)); 625 } 626 627 #ifndef PRODUCT 628 629 extern "C" void debug() { // to set things up for compiler debugging 630 Command c("debug"); 631 WizardMode = true; 632 PrintVMMessages = PrintCompilation = true; 633 PrintInlining = PrintAssembly = true; 634 tty->flush(); 635 } 636 637 638 extern "C" void ndebug() { // undo debug() 639 Command c("ndebug"); 640 PrintCompilation = false; 641 PrintInlining = PrintAssembly = false; 642 tty->flush(); 643 } 644 645 646 extern "C" void flush() { 647 Command c("flush"); 648 tty->flush(); 649 } 650 651 extern "C" void events() { 652 Command c("events"); 653 Events::print(); 654 } 655 656 extern "C" Method* findm(intptr_t pc) { 657 Command c("findm"); 658 nmethod* nm = CodeCache::find_nmethod((address)pc); 659 return (nm == NULL) ? (Method*)NULL : nm->method(); 660 } 661 662 663 extern "C" nmethod* findnm(intptr_t addr) { 664 Command c("findnm"); 665 return CodeCache::find_nmethod((address)addr); 666 } 667 668 // Another interface that isn't ambiguous in dbx. 669 // Can we someday rename the other find to hsfind? 670 extern "C" void hsfind(intptr_t x) { 671 Command c("hsfind"); 672 os::print_location(tty, x, false); 673 } 674 675 676 extern "C" void find(intptr_t x) { 677 Command c("find"); 678 os::print_location(tty, x, false); 679 } 680 681 682 extern "C" void findpc(intptr_t x) { 683 Command c("findpc"); 684 os::print_location(tty, x, true); 685 } 686 687 688 // Need method pointer to find bcp, when not in permgen. 689 extern "C" void findbcp(intptr_t method, intptr_t bcp) { 690 Command c("findbcp"); 691 Method* mh = (Method*)method; 692 if (!mh->is_native()) { 693 tty->print_cr("bci_from(%p) = %d; print_codes():", 694 mh, mh->bci_from(address(bcp))); 695 mh->print_codes_on(tty); 696 } 697 } 698 699 // int versions of all methods to avoid having to type type casts in the debugger 700 701 void pp(intptr_t p) { pp((void*)p); } 702 void pp(oop p) { pp((void*)p); } 703 704 void help() { 705 Command c("help"); 706 tty->print_cr("basic"); 707 tty->print_cr(" pp(void* p) - try to make sense of p"); 708 tty->print_cr(" pv(intptr_t p)- ((PrintableResourceObj*) p)->print()"); 709 tty->print_cr(" ps() - print current thread stack"); 710 tty->print_cr(" pss() - print all thread stacks"); 711 tty->print_cr(" pm(int pc) - print Method* given compiled PC"); 712 tty->print_cr(" findm(intptr_t pc) - finds Method*"); 713 tty->print_cr(" find(intptr_t x) - finds & prints nmethod/stub/bytecode/oop based on pointer into it"); 714 tty->print_cr(" pns(void* sp, void* fp, void* pc) - print native (i.e. mixed) stack trace. E.g."); 715 tty->print_cr(" pns($sp, $rbp, $pc) on Linux/amd64 and Solaris/amd64 or"); 716 tty->print_cr(" pns($sp, $ebp, $pc) on Linux/x86 or"); 717 tty->print_cr(" pns($sp, 0, $pc) on Linux/ppc64 or"); 718 tty->print_cr(" pns($sp + 0x7ff, 0, $pc) on Solaris/SPARC"); 719 tty->print_cr(" - in gdb do 'set overload-resolution off' before calling pns()"); 720 tty->print_cr(" - in dbx do 'frame 1' before calling pns()"); 721 722 tty->print_cr("misc."); 723 tty->print_cr(" flush() - flushes the log file"); 724 tty->print_cr(" events() - dump events from ring buffers"); 725 726 727 tty->print_cr("compiler debugging"); 728 tty->print_cr(" debug() - to set things up for compiler debugging"); 729 tty->print_cr(" ndebug() - undo debug"); 730 } 731 732 #endif // !PRODUCT 733 734 void print_native_stack(outputStream* st, frame fr, Thread* t, char* buf, int buf_size) { 735 736 // see if it's a valid frame 737 if (fr.pc()) { 738 st->print_cr("Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)"); 739 740 int count = 0; 741 while (count++ < StackPrintLimit) { 742 fr.print_on_error(st, buf, buf_size); 743 st->cr(); 744 // Compiled code may use EBP register on x86 so it looks like 745 // non-walkable C frame. Use frame.sender() for java frames. 746 if (t && t->is_Java_thread()) { 747 // Catch very first native frame by using stack address. 748 // For JavaThread stack_base and stack_size should be set. 749 if (!t->on_local_stack((address)(fr.real_fp() + 1))) { 750 break; 751 } 752 if (fr.is_java_frame() || fr.is_native_frame() || fr.is_runtime_frame()) { 753 RegisterMap map((JavaThread*)t, false); // No update 754 fr = fr.sender(&map); 755 } else { 756 fr = os::get_sender_for_C_frame(&fr); 757 } 758 } else { 759 // is_first_C_frame() does only simple checks for frame pointer, 760 // it will pass if java compiled code has a pointer in EBP. 761 if (os::is_first_C_frame(&fr)) break; 762 fr = os::get_sender_for_C_frame(&fr); 763 } 764 } 765 766 if (count > StackPrintLimit) { 767 st->print_cr("...<more frames>..."); 768 } 769 770 st->cr(); 771 } 772 } 773 774 #ifndef PRODUCT 775 776 extern "C" void pns(void* sp, void* fp, void* pc) { // print native stack 777 Command c("pns"); 778 static char buf[O_BUFLEN]; 779 Thread* t = Thread::current_or_null(); 780 // Call generic frame constructor (certain arguments may be ignored) 781 frame fr(sp, fp, pc); 782 print_native_stack(tty, fr, t, buf, sizeof(buf)); 783 } 784 785 #endif // !PRODUCT 786 787 ////////////////////////////////////////////////////////////////////////////// 788 // Test multiple STATIC_ASSERT forms in various scopes. 789 790 #ifndef PRODUCT 791 792 // namespace scope 793 STATIC_ASSERT(true); 794 STATIC_ASSERT(true); 795 STATIC_ASSERT(1 == 1); 796 STATIC_ASSERT(0 == 0); 797 798 void test_multiple_static_assert_forms_in_function_scope() { 799 STATIC_ASSERT(true); 800 STATIC_ASSERT(true); 801 STATIC_ASSERT(0 == 0); 802 STATIC_ASSERT(1 == 1); 803 } 804 805 // class scope 806 struct TestMultipleStaticAssertFormsInClassScope { 807 STATIC_ASSERT(true); 808 STATIC_ASSERT(true); 809 STATIC_ASSERT(0 == 0); 810 STATIC_ASSERT(1 == 1); 811 }; 812 813 #endif // !PRODUCT