[Bug] 日志窗口的「清空」会清掉崩溃导出里的 `minecraft.log`,导出的只剩一行合成退出码
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
調査の方向性
The shared list is logs in LauncherHelper.java, passed to LogWindow at about line 880. LogWindow.onClear() clears that same list, and GameCrashWindow.java (around lines 259-276) builds the export text from it, which LogExporter.java then writes as minecraft.log. Start by giving the export its own copy or separate buffer, so that clearing the window does not touch it. Done means the exported minecraft.log still contains the full output after the window's Clear button is pressed.
索引モデルが issue の本文から書いたものです。
説明
问题描述 | Bug Description
环境
- HMCL 3.16.4(当前
main上同样存在,见下方行号) - Windows 11 25H2 / Java 25 / 打开「显示游戏日志窗口」
现象
游戏正常启动后崩溃(Fabric 在 classTweaker 阶段抛错,exit code 1),从崩溃窗口导出崩溃信息,zip 中:
latest.log:完整,98 行 / 5330 字节,含完整异常栈(游戏 log4j 的 File appender 写入,符合预期)minecraft.log:只有 93 字节一行:
[13:46:22] [HMCL ProcessListener] Minecraft exit with code 1(0x1), type is APPLICATION_ERROR.
两文件时间相差 48 秒(13:45:34 → 13:46:22),hmcl.log 在该区间没有任何异常或读取错误记录。导出的文件看起来像一次正常导出,很难发现中间的日志已经丢失。
期望
minecraft.log 是启动器捕获的控制台输出,应包含 latest.log 的内容(这正是它作为“崩溃前输出”的价值)。日志窗口 UI 上的「清空」不应影响导出数据源。
复现步骤
- 实例设置里打开「显示游戏日志窗口」(或用「测试游戏」,
setTestMode()会强制打开) - 启动一个会崩溃的实例(启动期崩溃即可)
- 在游戏日志窗口点「清空」
- 崩溃后点「导出游戏崩溃信息」
- 检查 zip 里的
minecraft.log
结果:minecraft.log 只剩 onExit 合成的那行退出码,latest.log 依旧完整。
根因
HMCLProcessListener.logs 这一个 CircularArrayList 同时承担两个职责:日志窗口的显示缓冲、崩溃导出 minecraft.log 的唯一数据源。而窗口的「清空」按钮直接清的就是这个对象。
1) 捕获列表(唯一数据源)
HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java(main 8e1612784):
private final CircularArrayList<Log> logs;
...
this.logs = new CircularArrayList<>(Log.getLogLines() + 1);
...
if (showLogs) {
logWindow = new LogWindow(process, logs); // 第 880 行:把同一个实例交给 UI
logWindow.show();
}
2) 「清空」按钮直接清这个实例
HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java(main,行号 189-192、417-418):
private void onClear() {
impl.listView.getItems().clear();
logs.clear(); // ← 清掉的就是导出数据源
}
JFXButton clearButton = new JFXButton(i18n("button.clear"));
clearButton.setOnAction(e -> getSkinnable().onClear());
3) 导出时把这个列表拼成 minecraft.log
HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java(main,行号 259-276):
return CompletableFuture.supplyAsync(() ->
logs.stream().map(Log::getLog).collect(Collectors.joining("\n"))) // 第 263 行
.thenComposeAsync(logs -> {
...
return LogExporter.exportLogs(logFile, gameInstance, launchOptions, logs, ...); // 第 276 行
})...
HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java(main,行号 64):
zipper.putTextFile(logs, "minecraft.log");
4) 为什么导出只剩「一行退出码」
退出行是在 onExit 里、清空之后才追加的(main LauncherHelper.java:1013-1022):
if (showLogs) {
logBuffer.add(new Log(String.format("[%s] [HMCL ProcessListener] Minecraft exit with code %d(0x%x), type is %s.", ...)));
submitLogThread.interrupt();
submitLogThread.join();
}
清空后列表为空,最终只剩这一行合成内容,因此文件看起来还“像一个正常导出”,进一步掩盖了数据丢失。
启动器崩溃报告 / 启动器日志文件 | Launcher Crash Report / Launcher Log File
minecraft-exported-crash-info-2026-11-01T15-36-16.zip
minecraft-exported-crash-info-2026-11-01T13-46-24.zip
- 主要言語
- Java
- スター
- 10.9k
- フォーク
- 1.3k
- 平均マージ
- 11時間 40分
- マージ済み PR(30日)
- 90
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
HMCL-dev/HMCL のほかの issue
-
[Bug] 资源包列表 与 模组/数据包/世界 列表排列顺序不一致対応中かも @fishdry1000 が 4 日前に担当しました。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
HMCL-dev/HMCL#7062 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
HMCL-dev/HMCL#6681 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
HMCL-dev/HMCL#6134 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
[Feature] 添加防倒卖提示弹窗オープンenhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
HMCL-dev/HMCL#6065 · コメント 1 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
liberation-data/drivine4j#547 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
BindingServiceProperties.bindings regressed to a non-thread-safe TreeMap in GH-3158: concurrent first use of binding names corrupts it対応中かも @AkashB23 が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
spring-cloud/spring-cloud-stream#3321 ·
メンテナーはふだん 1 日以内に返信
-
ai-driven-fuzzing bug claude Minor
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
linagora/twake-calendar-side-service#1333 ·
メンテナーはふだん 1 日以内に返信
-
[BUG] 配置文件有问题オープンkind/bug needs-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
alibaba/spring-ai-alibaba#5036 ·
メンテナーはふだん 1 日以内に返信