Skip to content

Commit b9580e7

Browse files
committed
Allow getting a threadump
1 parent b664e80 commit b9580e7

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package dev.ithundxr.railwaystweaks.mixin;
2+
3+
import com.google.common.collect.Streams;
4+
import com.mojang.datafixers.DataFixer;
5+
import com.mojang.logging.LogUtils;
6+
import net.minecraft.CrashReport;
7+
import net.minecraft.CrashReportCategory;
8+
import net.minecraft.Util;
9+
import net.minecraft.server.Bootstrap;
10+
import net.minecraft.server.MinecraftServer;
11+
import net.minecraft.server.Services;
12+
import net.minecraft.server.WorldStem;
13+
import net.minecraft.server.dedicated.DedicatedServer;
14+
import net.minecraft.server.level.progress.ChunkProgressListenerFactory;
15+
import net.minecraft.server.packs.repository.PackRepository;
16+
import net.minecraft.world.level.GameRules;
17+
import net.minecraft.world.level.storage.LevelStorageSource;
18+
import org.slf4j.Logger;
19+
import org.spongepowered.asm.mixin.Mixin;
20+
import org.spongepowered.asm.mixin.Unique;
21+
import org.spongepowered.asm.mixin.injection.At;
22+
import org.spongepowered.asm.mixin.injection.Inject;
23+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
24+
25+
import java.io.File;
26+
import java.lang.management.ManagementFactory;
27+
import java.lang.management.ThreadInfo;
28+
import java.lang.management.ThreadMXBean;
29+
import java.net.Proxy;
30+
import java.util.stream.Collectors;
31+
32+
@Mixin(DedicatedServer.class)
33+
public abstract class DedicatedServerMixin extends MinecraftServer {
34+
@Unique private static final Logger railwaysTweaks$LOGGER = LogUtils.getLogger();
35+
36+
public DedicatedServerMixin(Thread serverThread, LevelStorageSource.LevelStorageAccess storageSource, PackRepository packRepository, WorldStem worldStem, Proxy proxy, DataFixer fixerUpper, Services services, ChunkProgressListenerFactory progressListenerFactory) {
37+
super(serverThread, storageSource, packRepository, worldStem, proxy, fixerUpper, services, progressListenerFactory);
38+
}
39+
40+
@Inject(method = "onServerExit", at = @At("TAIL"))
41+
private void railwaysTweaks$threadDumpOnShutdown(CallbackInfo ci) {
42+
ThreadMXBean threadmxbean = ManagementFactory.getThreadMXBean();
43+
ThreadInfo[] athreadinfo = threadmxbean.dumpAllThreads(true, true);
44+
StringBuilder stringbuilder = new StringBuilder();
45+
Error error = new Error("Shutdown Thread Dump");
46+
47+
for(ThreadInfo threadinfo : athreadinfo) {
48+
if (threadinfo.getThreadId() == this.getRunningThread().getId()) {
49+
error.setStackTrace(threadinfo.getStackTrace());
50+
}
51+
52+
stringbuilder.append(threadinfo);
53+
stringbuilder.append("\n");
54+
}
55+
56+
CrashReport crashreport = new CrashReport("Server shutdown thread dump", error);
57+
this.fillSystemReport(crashreport.getSystemReport());
58+
CrashReportCategory crashreportcategory = crashreport.addCategory("Thread Dump");
59+
crashreportcategory.setDetail("Threads", stringbuilder);
60+
CrashReportCategory crashreportcategory1 = crashreport.addCategory("Performance stats");
61+
crashreportcategory1.setDetail("Random tick rate", () -> this.getWorldData().getGameRules().getRule(GameRules.RULE_RANDOMTICKING).toString());
62+
crashreportcategory1.setDetail("Level stats", () -> Streams.stream(this.getAllLevels()).map((level) -> level.dimension() + ": " + level.getWatchdogStats()).collect(Collectors.joining(",\n")));
63+
Bootstrap.realStdoutPrintln("Crash report:\n" + crashreport.getFriendlyReport());
64+
File file1 = new File(new File(this.getServerDirectory(), "shutdown-thread-dumps"), "thread-dump-" + Util.getFilenameFormattedDateTime() + "-server.txt");
65+
if (crashreport.saveToFile(file1)) {
66+
railwaysTweaks$LOGGER.error("This crash report has been saved to: {}", file1.getAbsolutePath());
67+
} else {
68+
railwaysTweaks$LOGGER.error("We were unable to save this crash report to disk.");
69+
}
70+
}
71+
}

src/main/resources/railwaystweaks.mixins.json

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"package": "dev.ithundxr.railwaystweaks.mixin",
55
"compatibilityLevel": "JAVA_17",
66
"mixins": [
7+
"DedicatedServerMixin",
78
"LivingEntityMixin",
89
"ServerPlayerMixin",
910
"ServerStatusPacketListenerImplMixin",

0 commit comments

Comments
 (0)