blob: 918aa4ce90ff42fd8f16a207ce123c19816f4c6f [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 Lightb7c640d2019-03-20 15:52:13 -070040#include "events.h"
Alex Lighte814f9d2017-07-31 16:14:39 -070041#include "stack.h"
Andreas Gampea1a27c62017-01-11 16:37:16 -080042
Andreas Gampeb5eb94a2016-10-27 19:23:09 -070043namespace openjdkjvmti {
44
45class StackUtil {
46 public:
Andreas Gampea1a27c62017-01-11 16:37:16 -080047 static jvmtiError GetAllStackTraces(jvmtiEnv* env,
48 jint max_frame_count,
49 jvmtiStackInfo** stack_info_ptr,
50 jint* thread_count_ptr)
51 REQUIRES(!art::Locks::thread_list_lock_);
52
Andreas Gampef6f3b5f2017-01-13 09:21:42 -080053 static jvmtiError GetFrameCount(jvmtiEnv* env, jthread thread, jint* count_ptr);
54
55 static jvmtiError GetFrameLocation(jvmtiEnv* env,
56 jthread thread,
57 jint depth,
58 jmethodID* method_ptr,
59 jlocation* location_ptr);
60
Andreas Gampeb5eb94a2016-10-27 19:23:09 -070061 static jvmtiError GetStackTrace(jvmtiEnv* env,
62 jthread thread,
63 jint start_depth,
64 jint max_frame_count,
65 jvmtiFrameInfo* frame_buffer,
66 jint* count_ptr);
Andreas Gampeeba32fb2017-01-12 17:40:05 -080067
68 static jvmtiError GetThreadListStackTraces(jvmtiEnv* env,
69 jint thread_count,
70 const jthread* thread_list,
71 jint max_frame_count,
72 jvmtiStackInfo** stack_info_ptr);
Alex Light88e1ddd2017-08-21 13:09:55 -070073
74 static jvmtiError GetOwnedMonitorStackDepthInfo(jvmtiEnv* env,
75 jthread thread,
76 jint* info_cnt_ptr,
77 jvmtiMonitorStackDepthInfo** info_ptr);
78
79 static jvmtiError GetOwnedMonitorInfo(jvmtiEnv* env,
80 jthread thread,
81 jint* owned_monitor_count_ptr,
82 jobject** owned_monitors_ptr);
Alex Lighte814f9d2017-07-31 16:14:39 -070083
84 static jvmtiError NotifyFramePop(jvmtiEnv* env, jthread thread, jint depth);
Alex Light0aa7a5a2018-10-10 15:58:14 +000085
86 static jvmtiError PopFrame(jvmtiEnv* env, jthread thread);
Alex Lightb7c640d2019-03-20 15:52:13 -070087
88 template <typename T>
89 static jvmtiError ForceEarlyReturn(
90 jvmtiEnv* env, EventHandler* event_handler, jthread thread, T value);
Alex Lighte814f9d2017-07-31 16:14:39 -070091};
92
93struct FindFrameAtDepthVisitor : art::StackVisitor {
94 public:
95 FindFrameAtDepthVisitor(art::Thread* target, art::Context* ctx, jint depth)
96 REQUIRES_SHARED(art::Locks::mutator_lock_)
97 : art::StackVisitor(target, ctx, art::StackVisitor::StackWalkKind::kIncludeInlinedFrames),
98 found_frame_(false),
99 cnt_(0),
100 depth_(static_cast<size_t>(depth)) { }
101
102 bool FoundFrame() {
103 return found_frame_;
104 }
105
106 bool VisitFrame() NO_THREAD_SAFETY_ANALYSIS {
107 if (GetMethod()->IsRuntimeMethod()) {
108 return true;
109 }
110 if (cnt_ == depth_) {
111 // We found our frame, exit.
112 found_frame_ = true;
113 return false;
114 } else {
115 cnt_++;
116 return true;
117 }
118 }
119
Alex Light0aa7a5a2018-10-10 15:58:14 +0000120 art::ShadowFrame* GetOrCreateShadowFrame(/*out*/bool* created_frame)
121 REQUIRES_SHARED(art::Locks::mutator_lock_);
122
Alex Lighte814f9d2017-07-31 16:14:39 -0700123 private:
124 bool found_frame_;
125 size_t cnt_;
126 size_t depth_;
Andreas Gampeb5eb94a2016-10-27 19:23:09 -0700127};
128
129} // namespace openjdkjvmti
130
Andreas Gampe06c42a52017-07-26 14:17:14 -0700131#endif // ART_OPENJDKJVMTI_TI_STACK_H_