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