3.0 KiB
3.0 KiB
MINT HOOK FAILED — Proton 崩溃分析
结论
hook DLL 成功被 Proton 加载,但在初始化阶段(DllMain → init → patch())发生
EXCEPTION_ACCESS_VIOLATION (0xc0000005),crash 落在 native X3DAudio1_7.dll 内部。
不是缺 DLL、不是 WINEDLLOVERRIDES、不是 MinGW runtime 问题。
符号化结果(debug 构建 hook-debug-symbolized.dll,image base 0x180000000)
| RVA | 包含函数 | 含义 |
|---|---|---|
+0x521f15 |
std::thread::spawnhook::run_spawn_hooks (+0x165) |
崩溃点:首个线程 spawn 时的 std spawn-hooks 钩子,usize::saturating_add 内联叶子帧 |
+0x57bff |
repak::ext::ReadExt::read_array::<Block>(patch() 里 PakBuilder 读 mods_P.pak) |
读 pak 阶段 |
+0x54351 |
crossbeam_channel::Sender<tracing_appender::Msg>::drop |
tracing_appender non_blocking 日志 worker 的 channel 析构 |
+0x15966 |
D3DPERF_QueryRepeatFrame(proxy_dll 导出 thunk,hook/src/lib.rs:12) |
DLL 导出面 |
+0x2c221 |
tracing_subscriber::fmt::Timings extension get |
日志 subscriber 初始化 |
指向
5 个点全部落在初始化序列:proxy_dll!([x3daudio1_7, d3d9], init) 的 init →
patch() → mint_lib::setup_logging(bin_dir/mint_hook.log)(tracing_appender::non_blocking)
→ 读 Content/Paks/mods_P.pak → patternsleuth 解析 → hooks::initialize()。
崩溃点 run_spawn_hooks 说明:hook 在 DllMain(LoadLibrary,持 loader lock)期间
spawn 了线程(tracing_appender 日志 worker,或 tokio/tokio-console 相关)。
Windows/Proton 下 loader lock 内 spawn 线程是经典 AV/死锁源 —— 游戏主进程首次
LoadLibrary("x3daudio1_7") 时触发 init,此时 spawn 线程在 Proton Experimental 下崩。
修复方向(按优先级)
- 延迟日志/线程初始化:
patch()里不要在init(DllMain 上下文)里setup_logging/spawn 任何线程;把 non_blocking guard 的创建挪到hooks::initialize里真正进入游戏线程之后(如FEngineLoop::Init/tick 钩子首次触发时)。 - 若 tokio 相关线程也在 init 期创建,同样挪出 DllMain 上下文。
- 上游 issue:https://github.com/trumank/mint/issues/307 (Linux 使用场景)。
复现符号化
# 带符号 DLL(本 release 附件 hook-debug-symbolized.dll,debug=2 构建,代码布局与发布版一致)
x86_64-w64-mingw32-addr2line -Cfipe hook-debug-symbolized.dll \
0x180521f15 0x180057bff 0x180054351 0x180015966 0x18002c221
# 或用仓库里的通用脚本
python3.12 symbolize_hook.py hook-debug-symbolized.dll 0x521f15 0x57bff 0x54351 0x15966 0x2c221
临时恢复游戏
mv "/data/SteamLibrary/steamapps/common/Deep Rock Galactic/FSD/Binaries/Win64/x3daudio1_7.dll" \
"/data/SteamLibrary/steamapps/common/Deep Rock Galactic/FSD/Binaries/Win64/x3daudio1_7.dll.disabled"
# Steam 启动参数恢复 -disablemodding,去掉 WINEDLLOVERRIDES="x3daudio1_7=n,b"