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 *
150 last_caller = m;
151 vfst.next();
152 }
153 // if this is called from Class.forName0 and that is called from Class.forName,
154 // then print the caller of Class.forName. If this is Class.loadClass, then print
155 // that caller, otherwise keep quiet since this should be picked up elsewhere.
156 bool found_it = false;
157 if (!vfst.at_end() &&
158 vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
159 vfst.method()->name() == vmSymbols::forName0_name()) {
160 vfst.next();
161 if (!vfst.at_end() &&
162 vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
163 vfst.method()->name() == vmSymbols::forName_name()) {
164 vfst.next();
165 found_it = true;
166 }
167 } else if (last_caller != NULL &&
168 last_caller->method_holder()->name() ==
169 vmSymbols::java_lang_ClassLoader() &&
170 (last_caller->name() == vmSymbols::loadClassInternal_name() ||
171 last_caller->name() == vmSymbols::loadClass_name())) {
172 found_it = true;
173 } else if (!vfst.at_end()) {
174 if (vfst.method()->is_native()) {
175 // JNI call
176 found_it = true;
177 }
178 }
179 if (found_it && !vfst.at_end()) {
180 // found the caller
181 caller = vfst.method()->method_holder();
182 line_number = vfst.method()->line_number_from_bci(vfst.bci());
183 if (line_number == -1) {
184 // show method name if it's a native method
185 trace = vfst.method()->name_and_sig_as_C_string();
186 }
187 Symbol* s = caller->source_file_name();
188 if (s != NULL) {
189 source_file = s->as_C_string();
190 }
191 }
|
1 /*
2 * Copyright (c) 1997, 2018, 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 *
150 last_caller = m;
151 vfst.next();
152 }
153 // if this is called from Class.forName0 and that is called from Class.forName,
154 // then print the caller of Class.forName. If this is Class.loadClass, then print
155 // that caller, otherwise keep quiet since this should be picked up elsewhere.
156 bool found_it = false;
157 if (!vfst.at_end() &&
158 vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
159 vfst.method()->name() == vmSymbols::forName0_name()) {
160 vfst.next();
161 if (!vfst.at_end() &&
162 vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
163 vfst.method()->name() == vmSymbols::forName_name()) {
164 vfst.next();
165 found_it = true;
166 }
167 } else if (last_caller != NULL &&
168 last_caller->method_holder()->name() ==
169 vmSymbols::java_lang_ClassLoader() &&
170 last_caller->name() == vmSymbols::loadClass_name()) {
171 found_it = true;
172 } else if (!vfst.at_end()) {
173 if (vfst.method()->is_native()) {
174 // JNI call
175 found_it = true;
176 }
177 }
178 if (found_it && !vfst.at_end()) {
179 // found the caller
180 caller = vfst.method()->method_holder();
181 line_number = vfst.method()->line_number_from_bci(vfst.bci());
182 if (line_number == -1) {
183 // show method name if it's a native method
184 trace = vfst.method()->name_and_sig_as_C_string();
185 }
186 Symbol* s = caller->source_file_name();
187 if (s != NULL) {
188 source_file = s->as_C_string();
189 }
190 }
|