|
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