-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbtrace-latest.java
More file actions
144 lines (123 loc) · 4.64 KB
/
btrace-latest.java
File metadata and controls
144 lines (123 loc) · 4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS io.btrace:btrace-client:2.3.0-SNAPSHOT
//JAVA_OPTIONS -XX:+IgnoreUnrecognizedVMOptions
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class btrace {
/**
* BTrace client launcher for jbang.
*
* This script replicates the functionality of the btrace shell script:
* - Sets up proper VM arguments for all Java versions
* - Enables module exports for Java 9+
* - Handles tools.jar for Java 8 and earlier
*
* Usage:
* jbang btrace <pid> <script.java>
* jbang btrace -lp <pid>
* jbang btrace -le <pid>
*/
public static void main(String[] args) throws Exception {
String javaHome = System.getProperty("java.home");
if (javaHome == null || javaHome.isEmpty()) {
System.err.println("ERROR: JAVA_HOME not set");
System.exit(1);
}
// Build VM arguments
List<String> vmArgs = new ArrayList<>();
vmArgs.add("-XX:+IgnoreUnrecognizedVMOptions");
// Add module exports for Java 9+ (needed for VirtualMachine attach)
if (isJava9OrLater()) {
vmArgs.add("-XX:+AllowRedefinitionToAddDeleteMethods");
vmArgs.add("--add-exports");
vmArgs.add("jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED");
vmArgs.add("--add-exports");
vmArgs.add("java.base/sun.reflect=ALL-UNNAMED");
}
// Execute with proper classpath
executeWithClasspath(vmArgs, args, javaHome);
}
private static void executeWithClasspath(List<String> vmArgs, String[] args, String javaHome)
throws Exception {
// Get tools.jar path
String toolsJar = findToolsJar(javaHome);
// Build command
List<String> cmd = new ArrayList<>();
cmd.add(new File(javaHome, "bin/java").getAbsolutePath());
// Add VM arguments
cmd.addAll(vmArgs);
// Add classpath (ensure JBang app classpath is preserved)
String appCp = System.getProperty("java.class.path");
if (appCp != null || toolsJar != null) {
cmd.add("-cp");
if (appCp != null && toolsJar != null) {
cmd.add(appCp + File.pathSeparator + toolsJar);
} else if (appCp != null) {
cmd.add(appCp);
} else {
// Fallback if APP_CP not available
cmd.add(toolsJar);
}
}
// Add main class
cmd.add("org.openjdk.btrace.client.Main");
// Add user arguments
for (String arg : args) {
cmd.add(arg);
}
// Execute BTrace client
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.inheritIO();
int exitCode = pb.start().waitFor();
System.exit(exitCode);
}
private static String findToolsJar(String javaHome) {
// Try standard location: JAVA_HOME/lib/tools.jar
String toolsJar = new File(javaHome, "lib/tools.jar").getAbsolutePath();
if (new File(toolsJar).exists()) {
return toolsJar;
}
// Try JRE location: JAVA_HOME/../lib/tools.jar
toolsJar = new File(javaHome, "../lib/tools.jar").getAbsolutePath();
if (new File(toolsJar).exists()) {
return toolsJar;
}
// macOS: try classes.jar in framework
if (isMacOS()) {
String version = System.getProperty("java.version");
toolsJar = "/System/Library/Frameworks/JavaVM.framework/Versions/"
+ version + "/Classes/classes.jar";
if (new File(toolsJar).exists()) {
return toolsJar;
}
toolsJar = javaHome + "/../Classes/classes.jar";
if (new File(toolsJar).exists()) {
return toolsJar;
}
}
// Java 9+: modules are built in, no need for tools.jar
if (new File(javaHome, "jmods").exists()) {
return null;
}
// Not found, but don't fail for Java 9+
if (isJava9OrLater()) {
return null;
}
// For Java 8 and earlier, we need tools.jar
System.err.println("WARNING: Unable to locate tools.jar");
return null;
}
private static boolean isJava9OrLater() {
try {
String version = System.getProperty("java.version");
int major = Integer.parseInt(version.split("\\.")[0]);
return major >= 9;
} catch (Exception e) {
return false;
}
}
private static boolean isMacOS() {
return System.getProperty("os.name", "").toLowerCase().contains("mac");
}
}