blob: 55c4269086f2886fa5b3de153b33589021709e5d [file] [log] [blame]
Andreas Gampeb5eb94a2016-10-27 19:23:09 -07001/* Copyright (C) 2016 The Android Open Source Project
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3 *
4 * This file implements interfaces from the file jvmti.h. This implementation
5 * is licensed under the same terms as the file jvmti.h. The
6 * copyright and license information for the file jvmti.h follows.
7 *
8 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
9 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
10 *
11 * This code is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License version 2 only, as
13 * published by the Free Software Foundation. Oracle designates this
14 * particular file as subject to the "Classpath" exception as provided
15 * by Oracle in the LICENSE file that accompanied this code.
16 *
17 * This code is distributed in the hope that it will be useful, but WITHOUT
18 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 * version 2 for more details (a copy is included in the LICENSE file that
21 * accompanied this code).
22 *
23 * You should have received a copy of the GNU General Public License version
24 * 2 along with this work; if not, write to the Free Software Foundation,
25 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
26 *
27 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
28 * or visit www.oracle.com if you need additional information or have any
29 * questions.
30 */
31
Andreas Gampe06c42a52017-07-26 14:17:14 -070032#ifndef ART_OPENJDKJVMTI_TI_STACK_H_
33#define ART_OPENJDKJVMTI_TI_STACK_H_
Andreas Gampeb5eb94a2016-10-27 19:23:09 -070034
Andreas Gampea1a27c62017-01-11 16:37:16 -080035#include "jni.h"
Andreas Gampeb5eb94a2016-10-27 19:23:09 -070036#include "jvmti.h"
37
Alex Lighte814f9d2017-07-31 16:14:39 -070038#include "art_method.h"
Andreas Gampea1a27c62017-01-11 16:37:16 -080039#include "base/mutex.h"
Alex Lighte814f9d2017-07-31 16:14:39 -070040#include "stack.h"
Andreas Gampea1a27c62017-01-11 16:37:16 -080041
Andreas Gampeb5eb94a2016-10-27 19:23:09 -070042namespace openjdkjvmti {
43
44class StackUtil {
45 public:
Andreas Gampea1a27c62017-01-11 16:37:16 -080046 static jvmtiError GetAllStackTraces(jvmtiEnv* env,
47 jint max_frame_count,
48 jvmtiStackInfo** stack_info_ptr,
49 jint* thread_count_ptr)
50 REQUIRES(!art::Locks::thread_list_lock_);
51
Andreas Gampef6f3b5f2017-01-13 09:21:42 -080052 static jvmtiError GetFrameCount(jvmtiEnv* env, jthread thread, jint* count_ptr);
53
54 static jvmtiError GetFrameLocation(jvmtiEnv* env,
55 jthread thread,
56 jint depth,
57 jmethodID* method_ptr,
58 jlocation* location_ptr);
59
Andreas Gampeb5eb94a2016-10-27 19:23:09 -070060 static jvmtiError GetStackTrace(jvmtiEnv* env,
61 jthread thread,
62 jint start_depth,
63 jint max_frame_count,
64 jvmtiFrameInfo* frame_buffer,
65 jint* count_ptr);
Andreas Gampeeba32fb2017-01-12 17:40:05 -080066
67 static jvmtiError GetThreadListStackTraces(jvmtiEnv* env,
68 jint thread_count,
69 const jthread* thread_list,
70 jint max_frame_count,
71 jvmtiStackInfo** stack_info_ptr);
Alex Light88e1ddd2017-08-21 13:09:55 -070072
73 static jvmtiError GetOwnedMonitorStackDepthInfo(jvmtiEnv* env,
74 jthread thread,
75 jint* info_cnt_ptr,
76 jvmtiMonitorStackDepthInfo** info_ptr);
77
78 static jvmtiError GetOwnedMonitorInfo(jvmtiEnv* env,
79 jthread thread,
80 jint* owned_monitor_count_ptr,
81 jobject** owned_monitors_ptr);
Alex Lighte814f9d2017-07-31 16:14:39 -070082
83 static jvmtiError NotifyFramePop(jvmtiEnv* env, jthread thread, jint depth);
Alex Light0aa7a5a2018-10-10 15:58:14 +000084
85 static jvmtiError PopFrame(jvmtiEnv* env, jthread thread);
Alex Lighte814f9d2017-07-31 16:14:39 -070086};
87
88struct FindFrameAtDepthVisitor : art::StackVisitor {
89 public:
90 FindFrameAtDepthVisitor(art::Thread* target, art::Context* ctx, jint depth)
91 REQUIRES_SHARED(art::Locks::mutator_lock_)
92 : art::StackVisitor(target, ctx, art::StackVisitor::StackWalkKind::kIncludeInlinedFrames),
93 found_frame_(false),
94 cnt_(0),
95 depth_(static_cast<size_t>(depth)) { }
96
97 bool FoundFrame() {
98 return found_frame_;
99 }
100
101 bool VisitFrame() NO_THREAD_SAFETY_ANALYSIS {
102 if (GetMethod()->IsRuntimeMethod()) {
103 return true;
104 }
105 if (cnt_ == depth_) {
106 // We found our frame, exit.
107 found_frame_ = true;
108 return false;
109 } else {
110 cnt_++;
111 return true;
112 }
113 }
114
Alex Light0aa7a5a2018-10-10 15:58:14 +0000115 art::ShadowFrame* GetOrCreateShadowFrame(/*out*/bool* created_frame)
116 REQUIRES_SHARED(art::Locks::mutator_lock_);
117
Alex Lighte814f9d2017-07-31 16:14:39 -0700118 private:
119 bool found_frame_;
120 size_t cnt_;
121 size_t depth_;
Andreas Gampeb5eb94a2016-10-27 19:23:09 -0700122};
123
124} // namespace openjdkjvmti
125
Andreas Gampe06c42a52017-07-26 14:17:14 -0700126#endif // ART_OPENJDKJVMTI_TI_STACK_H_