|
40 | 40 | */
|
41 | 41 | package com.oracle.graal.python.test.advance;
|
42 | 42 |
|
| 43 | +import java.io.BufferedWriter; |
| 44 | +import java.io.FileWriter; |
43 | 45 | import java.io.IOException;
|
44 | 46 | import java.lang.management.ManagementFactory;
|
| 47 | +import java.lang.management.ThreadInfo; |
| 48 | +import java.lang.management.ThreadMXBean; |
45 | 49 | import java.nio.file.Files;
|
46 | 50 | import java.nio.file.Path;
|
| 51 | +import java.nio.file.Paths; |
47 | 52 | import java.util.ArrayList;
|
48 | 53 | import java.util.List;
|
49 | 54 | import java.util.Map;
|
@@ -120,15 +125,33 @@ private void dumpAndAnalyze() {
|
120 | 125 | }
|
121 | 126 |
|
122 | 127 | MBeanServer server = doFullGC();
|
| 128 | + String threadDump = getThreadDump(); |
123 | 129 | Path dumpFile = dumpHeap(server);
|
124 | 130 | boolean fail = checkForLeaks(dumpFile);
|
125 | 131 | if (fail) {
|
| 132 | + System.err.print(threadDump); |
126 | 133 | System.exit(255);
|
127 | 134 | } else {
|
128 | 135 | System.exit(0);
|
129 | 136 | }
|
130 | 137 | }
|
131 | 138 |
|
| 139 | + private String getThreadDump() { |
| 140 | + ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); |
| 141 | + ThreadInfo[] threads = threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds(), 100); |
| 142 | + final String line = "=====================================\n"; |
| 143 | + StringBuilder sb = new StringBuilder(line); |
| 144 | + for (ThreadInfo thread : threads) { |
| 145 | + sb.append("-------\n"); |
| 146 | + sb.append(thread.getThreadName()).append('\n'); |
| 147 | + sb.append("Thread state:").append(thread.getThreadState()).append('\n'); |
| 148 | + for (StackTraceElement element : thread.getStackTrace()) { |
| 149 | + sb.append(" ").append(element).append('\n'); |
| 150 | + } |
| 151 | + } |
| 152 | + return sb.append(line).toString(); |
| 153 | + } |
| 154 | + |
132 | 155 | private boolean checkForLeaks(Path dumpFile) {
|
133 | 156 | boolean fail = false;
|
134 | 157 | try {
|
|
0 commit comments