forte.cpp revision 6402:2377269bd73d
1/*
2 * Copyright (c) 2003, 2013, 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 "code/debugInfoRec.hpp"
27#include "code/pcDesc.hpp"
28#include "gc_interface/collectedHeap.inline.hpp"
29#include "memory/space.hpp"
30#include "memory/universe.inline.hpp"
31#include "oops/oop.inline.hpp"
32#include "oops/oop.inline2.hpp"
33#include "prims/forte.hpp"
34#include "runtime/javaCalls.hpp"
35#include "runtime/thread.inline.hpp"
36#include "runtime/vframe.hpp"
37#include "runtime/vframeArray.hpp"
38
39// call frame copied from old .h file and renamed
40typedef struct {
41    jint lineno;                      // line number in the source file
42    jmethodID method_id;              // method executed in this frame
43} ASGCT_CallFrame;
44
45// call trace copied from old .h file and renamed
46typedef struct {
47    JNIEnv *env_id;                   // Env where trace was recorded
48    jint num_frames;                  // number of frames in this trace
49    ASGCT_CallFrame *frames;          // frames
50} ASGCT_CallTrace;
51
52// These name match the names reported by the forte quality kit
53enum {
54  ticks_no_Java_frame         =  0,
55  ticks_no_class_load         = -1,
56  ticks_GC_active             = -2,
57  ticks_unknown_not_Java      = -3,
58  ticks_not_walkable_not_Java = -4,
59  ticks_unknown_Java          = -5,
60  ticks_not_walkable_Java     = -6,
61  ticks_unknown_state         = -7,
62  ticks_thread_exit           = -8,
63  ticks_deopt                 = -9,
64  ticks_safepoint             = -10
65};
66
67#if INCLUDE_JVMTI
68
69//-------------------------------------------------------
70
71// Native interfaces for use by Forte tools.
72
73
74#if !defined(IA64) && !defined(PPC64)
75
76class vframeStreamForte : public vframeStreamCommon {
77 public:
78  // constructor that starts with sender of frame fr (top_frame)
79  vframeStreamForte(JavaThread *jt, frame fr, bool stop_at_java_call_stub);
80  void forte_next();
81};
82
83
84static bool is_decipherable_compiled_frame(JavaThread* thread, frame* fr, nmethod* nm);
85static bool is_decipherable_interpreted_frame(JavaThread* thread,
86                                              frame* fr,
87                                              Method** method_p,
88                                              int* bci_p);
89
90
91
92
93vframeStreamForte::vframeStreamForte(JavaThread *jt,
94                                     frame fr,
95                                     bool stop_at_java_call_stub) : vframeStreamCommon(jt) {
96
97  _stop_at_java_call_stub = stop_at_java_call_stub;
98  _frame = fr;
99
100  // We must always have a valid frame to start filling
101
102  bool filled_in = fill_from_frame();
103
104  assert(filled_in, "invariant");
105
106}
107
108
109// Solaris SPARC Compiler1 needs an additional check on the grandparent
110// of the top_frame when the parent of the top_frame is interpreted and
111// the grandparent is compiled. However, in this method we do not know
112// the relationship of the current _frame relative to the top_frame so
113// we implement a more broad sanity check. When the previous callee is
114// interpreted and the current sender is compiled, we verify that the
115// current sender is also walkable. If it is not walkable, then we mark
116// the current vframeStream as at the end.
117void vframeStreamForte::forte_next() {
118  // handle frames with inlining
119  if (_mode == compiled_mode &&
120      vframeStreamCommon::fill_in_compiled_inlined_sender()) {
121    return;
122  }
123
124  // handle general case
125
126  int loop_count = 0;
127  int loop_max = MaxJavaStackTraceDepth * 2;
128
129
130  do {
131
132    loop_count++;
133
134    // By the time we get here we should never see unsafe but better
135    // safe then segv'd
136
137    if (loop_count > loop_max || !_frame.safe_for_sender(_thread)) {
138      _mode = at_end_mode;
139      return;
140    }
141
142    _frame = _frame.sender(&_reg_map);
143
144  } while (!fill_from_frame());
145}
146
147// Determine if 'fr' is a decipherable compiled frame. We are already
148// assured that fr is for a java nmethod.
149
150static bool is_decipherable_compiled_frame(JavaThread* thread, frame* fr, nmethod* nm) {
151  assert(nm->is_java_method(), "invariant");
152
153  if (thread->has_last_Java_frame() && thread->last_Java_pc() == fr->pc()) {
154    // We're stopped at a call into the JVM so look for a PcDesc with
155    // the actual pc reported by the frame.
156    PcDesc* pc_desc = nm->pc_desc_at(fr->pc());
157
158    // Did we find a useful PcDesc?
159    if (pc_desc != NULL &&
160        pc_desc->scope_decode_offset() != DebugInformationRecorder::serialized_null) {
161      return true;
162    }
163  }
164
165  // We're at some random pc in the nmethod so search for the PcDesc
166  // whose pc is greater than the current PC.  It's done this way
167  // because the extra PcDescs that are recorded for improved debug
168  // info record the end of the region covered by the ScopeDesc
169  // instead of the beginning.
170  PcDesc* pc_desc = nm->pc_desc_near(fr->pc() + 1);
171
172  // Now do we have a useful PcDesc?
173  if (pc_desc == NULL ||
174      pc_desc->scope_decode_offset() == DebugInformationRecorder::serialized_null) {
175    // No debug information available for this pc
176    // vframeStream would explode if we try and walk the frames.
177    return false;
178  }
179
180  // This PcDesc is useful however we must adjust the frame's pc
181  // so that the vframeStream lookups will use this same pc
182  fr->set_pc(pc_desc->real_pc(nm));
183  return true;
184}
185
186
187// Determine if 'fr' is a walkable interpreted frame. Returns false
188// if it is not. *method_p, and *bci_p are not set when false is
189// returned. *method_p is non-NULL if frame was executing a Java
190// method. *bci_p is != -1 if a valid BCI in the Java method could
191// be found.
192// Note: this method returns true when a valid Java method is found
193// even if a valid BCI cannot be found.
194
195static bool is_decipherable_interpreted_frame(JavaThread* thread,
196                                              frame* fr,
197                                              Method** method_p,
198                                              int* bci_p) {
199  assert(fr->is_interpreted_frame(), "just checking");
200
201  // top frame is an interpreted frame
202  // check if it is walkable (i.e. valid Method* and valid bci)
203
204  // Because we may be racing a gc thread the method and/or bci
205  // of a valid interpreter frame may look bad causing us to
206  // fail the is_interpreted_frame_valid test. If the thread
207  // is in any of the following states we are assured that the
208  // frame is in fact valid and we must have hit the race.
209
210  JavaThreadState state = thread->thread_state();
211  bool known_valid = (state == _thread_in_native ||
212                      state == _thread_in_vm ||
213                      state == _thread_blocked );
214
215  if (known_valid || fr->is_interpreted_frame_valid(thread)) {
216
217    // The frame code should completely validate the frame so that
218    // references to Method* and bci are completely safe to access
219    // If they aren't the frame code should be fixed not this
220    // code. However since gc isn't locked out the values could be
221    // stale. This is a race we can never completely win since we can't
222    // lock out gc so do one last check after retrieving their values
223    // from the frame for additional safety
224
225    Method* method = fr->interpreter_frame_method();
226
227    // We've at least found a method.
228    // NOTE: there is something to be said for the approach that
229    // if we don't find a valid bci then the method is not likely
230    // a valid method. Then again we may have caught an interpreter
231    // frame in the middle of construction and the bci field is
232    // not yet valid.
233
234    *method_p = method;
235    if (!method->is_valid_method()) return false;
236
237    intptr_t bcx = fr->interpreter_frame_bcx();
238
239    int      bci = method->validate_bci_from_bcx(bcx);
240
241    // note: bci is set to -1 if not a valid bci
242    *bci_p = bci;
243    return true;
244  }
245
246  return false;
247}
248
249
250// Determine if 'fr' can be used to find an initial Java frame.
251// Return false if it can not find a fully decipherable Java frame
252// (in other words a frame that isn't safe to use in a vframe stream).
253// Obviously if it can't even find a Java frame false will also be returned.
254//
255// If we find a Java frame decipherable or not then by definition we have
256// identified a method and that will be returned to the caller via method_p.
257// If we can determine a bci that is returned also. (Hmm is it possible
258// to return a method and bci and still return false? )
259//
260// The initial Java frame we find (if any) is return via initial_frame_p.
261//
262
263static bool find_initial_Java_frame(JavaThread* thread,
264                                    frame* fr,
265                                    frame* initial_frame_p,
266                                    Method** method_p,
267                                    int* bci_p) {
268
269  // It is possible that for a frame containing an nmethod
270  // we can capture the method but no bci. If we get no
271  // bci the frame isn't walkable but the method is usable.
272  // Therefore we init the returned Method* to NULL so the
273  // caller can make the distinction.
274
275  *method_p = NULL;
276
277  // On the initial call to this method the frame we get may not be
278  // recognizable to us. This should only happen if we are in a JRT_LEAF
279  // or something called by a JRT_LEAF method.
280
281
282
283  frame candidate = *fr;
284
285  // If the starting frame we were given has no codeBlob associated with
286  // it see if we can find such a frame because only frames with codeBlobs
287  // are possible Java frames.
288
289  if (fr->cb() == NULL) {
290
291    // See if we can find a useful frame
292    int loop_count;
293    int loop_max = MaxJavaStackTraceDepth * 2;
294    RegisterMap map(thread, false);
295
296    for (loop_count = 0; loop_count < loop_max; loop_count++) {
297      if (!candidate.safe_for_sender(thread)) return false;
298      candidate = candidate.sender(&map);
299      if (candidate.cb() != NULL) break;
300    }
301    if (candidate.cb() == NULL) return false;
302  }
303
304  // We have a frame known to be in the codeCache
305  // We will hopefully be able to figure out something to do with it.
306  int loop_count;
307  int loop_max = MaxJavaStackTraceDepth * 2;
308  RegisterMap map(thread, false);
309
310  for (loop_count = 0; loop_count < loop_max; loop_count++) {
311
312    if (candidate.is_entry_frame()) {
313      // jcw is NULL if the java call wrapper couldn't be found
314      JavaCallWrapper *jcw = candidate.entry_frame_call_wrapper_if_safe(thread);
315      // If initial frame is frame from StubGenerator and there is no
316      // previous anchor, there are no java frames associated with a method
317      if (jcw == NULL || jcw->is_first_frame()) {
318        return false;
319      }
320    }
321
322    if (candidate.is_interpreted_frame()) {
323      if (is_decipherable_interpreted_frame(thread, &candidate, method_p, bci_p)) {
324        *initial_frame_p = candidate;
325        return true;
326      }
327
328      // Hopefully we got some data
329      return false;
330    }
331
332    if (candidate.cb()->is_nmethod()) {
333
334      nmethod* nm = (nmethod*) candidate.cb();
335      *method_p = nm->method();
336
337      // If the frame isn't fully decipherable then the default
338      // value for the bci is a signal that we don't have a bci.
339      // If we have a decipherable frame this bci value will
340      // not be used.
341
342      *bci_p = -1;
343
344      *initial_frame_p = candidate;
345
346      // Native wrapper code is trivial to decode by vframeStream
347
348      if (nm->is_native_method()) return true;
349
350      // If it isn't decipherable then we have found a pc that doesn't
351      // have a PCDesc that can get us a bci however we did find
352      // a method
353
354      if (!is_decipherable_compiled_frame(thread, &candidate, nm)) {
355        return false;
356      }
357
358      // is_decipherable_compiled_frame may modify candidate's pc
359      *initial_frame_p = candidate;
360
361      assert(nm->pc_desc_at(candidate.pc()) != NULL, "if it's decipherable then pc must be valid");
362
363      return true;
364    }
365
366    // Must be some stub frame that we don't care about
367
368    if (!candidate.safe_for_sender(thread)) return false;
369    candidate = candidate.sender(&map);
370
371    // If it isn't in the code cache something is wrong
372    // since once we find a frame in the code cache they
373    // all should be there.
374
375    if (candidate.cb() == NULL) return false;
376
377  }
378
379  return false;
380
381}
382
383static void forte_fill_call_trace_given_top(JavaThread* thd,
384                                            ASGCT_CallTrace* trace,
385                                            int depth,
386                                            frame top_frame) {
387  NoHandleMark nhm;
388
389  frame initial_Java_frame;
390  Method* method;
391  int bci;
392  int count;
393
394  count = 0;
395  assert(trace->frames != NULL, "trace->frames must be non-NULL");
396
397  bool fully_decipherable = find_initial_Java_frame(thd, &top_frame, &initial_Java_frame, &method, &bci);
398
399  // The frame might not be walkable but still recovered a method
400  // (e.g. an nmethod with no scope info for the pc)
401
402  if (method == NULL) return;
403
404  if (!method->is_valid_method()) {
405    trace->num_frames = ticks_GC_active; // -2
406    return;
407  }
408
409  // We got a Java frame however it isn't fully decipherable
410  // so it won't necessarily be safe to use it for the
411  // initial frame in the vframe stream.
412
413  if (!fully_decipherable) {
414    // Take whatever method the top-frame decoder managed to scrape up.
415    // We look further at the top frame only if non-safepoint
416    // debugging information is available.
417    count++;
418    trace->num_frames = count;
419    trace->frames[0].method_id = method->find_jmethod_id_or_null();
420    if (!method->is_native()) {
421      trace->frames[0].lineno = bci;
422    } else {
423      trace->frames[0].lineno = -3;
424    }
425
426    if (!initial_Java_frame.safe_for_sender(thd)) return;
427
428    RegisterMap map(thd, false);
429    initial_Java_frame = initial_Java_frame.sender(&map);
430  }
431
432  vframeStreamForte st(thd, initial_Java_frame, false);
433
434  for (; !st.at_end() && count < depth; st.forte_next(), count++) {
435    bci = st.bci();
436    method = st.method();
437
438    if (!method->is_valid_method()) {
439      // we throw away everything we've gathered in this sample since
440      // none of it is safe
441      trace->num_frames = ticks_GC_active; // -2
442      return;
443    }
444
445    trace->frames[count].method_id = method->find_jmethod_id_or_null();
446    if (!method->is_native()) {
447      trace->frames[count].lineno = bci;
448    } else {
449      trace->frames[count].lineno = -3;
450    }
451  }
452  trace->num_frames = count;
453  return;
454}
455
456
457// Forte Analyzer AsyncGetCallTrace() entry point. Currently supported
458// on Linux X86, Solaris SPARC and Solaris X86.
459//
460// Async-safe version of GetCallTrace being called from a signal handler
461// when a LWP gets interrupted by SIGPROF but the stack traces are filled
462// with different content (see below).
463//
464// This function must only be called when JVM/TI
465// CLASS_LOAD events have been enabled since agent startup. The enabled
466// event will cause the jmethodIDs to be allocated at class load time.
467// The jmethodIDs cannot be allocated in a signal handler because locks
468// cannot be grabbed in a signal handler safely.
469//
470// void (*AsyncGetCallTrace)(ASGCT_CallTrace *trace, jint depth, void* ucontext)
471//
472// Called by the profiler to obtain the current method call stack trace for
473// a given thread. The thread is identified by the env_id field in the
474// ASGCT_CallTrace structure. The profiler agent should allocate a ASGCT_CallTrace
475// structure with enough memory for the requested stack depth. The VM fills in
476// the frames buffer and the num_frames field.
477//
478// Arguments:
479//
480//   trace    - trace data structure to be filled by the VM.
481//   depth    - depth of the call stack trace.
482//   ucontext - ucontext_t of the LWP
483//
484// ASGCT_CallTrace:
485//   typedef struct {
486//       JNIEnv *env_id;
487//       jint num_frames;
488//       ASGCT_CallFrame *frames;
489//   } ASGCT_CallTrace;
490//
491// Fields:
492//   env_id     - ID of thread which executed this trace.
493//   num_frames - number of frames in the trace.
494//                (< 0 indicates the frame is not walkable).
495//   frames     - the ASGCT_CallFrames that make up this trace. Callee followed by callers.
496//
497//  ASGCT_CallFrame:
498//    typedef struct {
499//        jint lineno;
500//        jmethodID method_id;
501//    } ASGCT_CallFrame;
502//
503//  Fields:
504//    1) For Java frame (interpreted and compiled),
505//       lineno    - bci of the method being executed or -1 if bci is not available
506//       method_id - jmethodID of the method being executed
507//    2) For native method
508//       lineno    - (-3)
509//       method_id - jmethodID of the method being executed
510
511extern "C" {
512JNIEXPORT
513void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext) {
514  JavaThread* thread;
515
516  if (trace->env_id == NULL ||
517    (thread = JavaThread::thread_from_jni_environment(trace->env_id)) == NULL ||
518    thread->is_exiting()) {
519
520    // bad env_id, thread has exited or thread is exiting
521    trace->num_frames = ticks_thread_exit; // -8
522    return;
523  }
524
525  if (thread->in_deopt_handler()) {
526    // thread is in the deoptimization handler so return no frames
527    trace->num_frames = ticks_deopt; // -9
528    return;
529  }
530
531  assert(JavaThread::current() == thread,
532         "AsyncGetCallTrace must be called by the current interrupted thread");
533
534  if (!JvmtiExport::should_post_class_load()) {
535    trace->num_frames = ticks_no_class_load; // -1
536    return;
537  }
538
539  if (Universe::heap()->is_gc_active()) {
540    trace->num_frames = ticks_GC_active; // -2
541    return;
542  }
543
544  switch (thread->thread_state()) {
545  case _thread_new:
546  case _thread_uninitialized:
547  case _thread_new_trans:
548    // We found the thread on the threads list above, but it is too
549    // young to be useful so return that there are no Java frames.
550    trace->num_frames = 0;
551    break;
552  case _thread_in_native:
553  case _thread_in_native_trans:
554  case _thread_blocked:
555  case _thread_blocked_trans:
556  case _thread_in_vm:
557  case _thread_in_vm_trans:
558    {
559      frame fr;
560
561      // param isInJava == false - indicate we aren't in Java code
562      if (!thread->pd_get_top_frame_for_signal_handler(&fr, ucontext, false)) {
563        trace->num_frames = ticks_unknown_not_Java;  // -3 unknown frame
564      } else {
565        if (!thread->has_last_Java_frame()) {
566          trace->num_frames = 0; // No Java frames
567        } else {
568          trace->num_frames = ticks_not_walkable_not_Java;    // -4 non walkable frame by default
569          forte_fill_call_trace_given_top(thread, trace, depth, fr);
570
571          // This assert would seem to be valid but it is not.
572          // It would be valid if we weren't possibly racing a gc
573          // thread. A gc thread can make a valid interpreted frame
574          // look invalid. It's a small window but it does happen.
575          // The assert is left here commented out as a reminder.
576          // assert(trace->num_frames != ticks_not_walkable_not_Java, "should always be walkable");
577
578        }
579      }
580    }
581    break;
582  case _thread_in_Java:
583  case _thread_in_Java_trans:
584    {
585      frame fr;
586
587      // param isInJava == true - indicate we are in Java code
588      if (!thread->pd_get_top_frame_for_signal_handler(&fr, ucontext, true)) {
589        trace->num_frames = ticks_unknown_Java;  // -5 unknown frame
590      } else {
591        trace->num_frames = ticks_not_walkable_Java;  // -6, non walkable frame by default
592        forte_fill_call_trace_given_top(thread, trace, depth, fr);
593      }
594    }
595    break;
596  default:
597    // Unknown thread state
598    trace->num_frames = ticks_unknown_state; // -7
599    break;
600  }
601}
602
603
604#ifndef _WINDOWS
605// Support for the Forte(TM) Peformance Tools collector.
606//
607// The method prototype is derived from libcollector.h. For more
608// information, please see the libcollect man page.
609
610// Method to let libcollector know about a dynamically loaded function.
611// Because it is weakly bound, the calls become NOP's when the library
612// isn't present.
613#ifdef __APPLE__
614// XXXDARWIN: Link errors occur even when __attribute__((weak_import))
615// is added
616#define collector_func_load(x0,x1,x2,x3,x4,x5,x6) ((void) 0)
617#else
618void    collector_func_load(char* name,
619                            void* null_argument_1,
620                            void* null_argument_2,
621                            void *vaddr,
622                            int size,
623                            int zero_argument,
624                            void* null_argument_3);
625#pragma weak collector_func_load
626#define collector_func_load(x0,x1,x2,x3,x4,x5,x6) \
627        ( collector_func_load ? collector_func_load(x0,x1,x2,x3,x4,x5,x6),(void)0 : (void)0 )
628#endif // __APPLE__
629#endif // !_WINDOWS
630
631} // end extern "C"
632#endif // !IA64 && !PPC64
633
634void Forte::register_stub(const char* name, address start, address end) {
635#if !defined(_WINDOWS) && !defined(IA64) && !defined(PPC64)
636  assert(pointer_delta(end, start, sizeof(jbyte)) < INT_MAX,
637         "Code size exceeds maximum range");
638
639  collector_func_load((char*)name, NULL, NULL, start,
640    pointer_delta(end, start, sizeof(jbyte)), 0, NULL);
641#endif // !_WINDOWS && !IA64 && !PPC64
642}
643
644#else // INCLUDE_JVMTI
645extern "C" {
646  JNIEXPORT
647  void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext) {
648    trace->num_frames = ticks_no_class_load; // -1
649  }
650}
651#endif // INCLUDE_JVMTI
652