1 /*
2 * Copyright (c) 2010, 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 */
152 // Write out the class file being loaded. It's useful
153 // to have if the JVM crashes.
154 FileUtils.writeBytesToFile(rescueFile, classBytes);
155 if (classFileMessagePrinted.compareAndSet(false, true)) {
156 Env.traceImportant("If the JVM crashes then "
157 + "the class file causing the crash is saved as *_*_"
158 + RESCUE_FILE_NAME);
159 }
160 }
161
162 Thread parserThread = new Thread() {
163 public void run() {
164 try {
165 Class<?> c;
166 if (unsafeLoad) {
167 c = UnsafeAccess.unsafe.defineAnonymousClass(hostClass, classBytes, null);
168 } else {
169 c = CustomClassLoaders.makeClassBytesLoader(classBytes, className)
170 .loadClass(className);
171 }
172 c.newInstance();
173 } catch (Throwable e) {
174 Env.traceVerbose(e, "parser caught exception");
175 }
176 }
177 };
178
179 parserThread.setDaemon(true);
180 parserThread.start();
181 parserThread.join(parseTimeout);
182
183 if (parserThread.isAlive()) {
184 Env.complain("Killing parser thread");
185 StackTraceElement[] stack = parserThread.getStackTrace();
186 Env.traceImportant(parserThread + " stack trace:");
187 for (int i = 0; i < stack.length; ++i) {
188 Env.traceImportant(parserThread + "\tat " + stack[i]);
189 }
190
191 if (saveClassFile) {
192 Files.move(rescueFile.toPath(), Paths.get(fileNamePrefix
|
1 /*
2 * Copyright (c) 2010, 2019, 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 */
152 // Write out the class file being loaded. It's useful
153 // to have if the JVM crashes.
154 FileUtils.writeBytesToFile(rescueFile, classBytes);
155 if (classFileMessagePrinted.compareAndSet(false, true)) {
156 Env.traceImportant("If the JVM crashes then "
157 + "the class file causing the crash is saved as *_*_"
158 + RESCUE_FILE_NAME);
159 }
160 }
161
162 Thread parserThread = new Thread() {
163 public void run() {
164 try {
165 Class<?> c;
166 if (unsafeLoad) {
167 c = UnsafeAccess.unsafe.defineAnonymousClass(hostClass, classBytes, null);
168 } else {
169 c = CustomClassLoaders.makeClassBytesLoader(classBytes, className)
170 .loadClass(className);
171 }
172 UnsafeAccess.unsafe.ensureClassInitialized(c);
173 } catch (Throwable e) {
174 Env.traceVerbose(e, "parser caught exception");
175 }
176 }
177 };
178
179 parserThread.setDaemon(true);
180 parserThread.start();
181 parserThread.join(parseTimeout);
182
183 if (parserThread.isAlive()) {
184 Env.complain("Killing parser thread");
185 StackTraceElement[] stack = parserThread.getStackTrace();
186 Env.traceImportant(parserThread + " stack trace:");
187 for (int i = 0; i < stack.length; ++i) {
188 Env.traceImportant(parserThread + "\tat " + stack[i]);
189 }
190
191 if (saveClassFile) {
192 Files.move(rescueFile.toPath(), Paths.get(fileNamePrefix
|