Windows: automatic filesystem tracking makes Git/MSYS sh.exe fail with MapViewOfFileEx error 487
維護者通常 1 天內回覆
還沒有人認領這個 Issue。
評估
- 難度
- 5/5
- 預估耗時
- 一週以上
- 新手友好度
- 18/100
- Issue 類型
- 缺陷
- 描述清晰度
- 基本清楚
- 活躍度
- 活躍
- 領域
- build-system, devtools
研究方向
Start with crates/fspy/src/windows/mod.rs and crates/fspy_preload_windows/src/windows/detours/create_process.rs, where the tracking DLL is injected into suspended processes and propagated to children. Then check ExecutionMode::build in crates/vt/src/session/execute/mod.rs to see when fspy is enabled. Reproduce with the probe files in the issue and vp run --cache probe. Done would mean Git/MSYS sh.exe starts cleanly under automatic tracking, verified by the probe exiting 0.
由索引模型根據 Issue 內容生成。
描述
Summary
On Windows, a cache-enabled vp run using automatic filesystem tracking causes Git for Windows sh.exe to fail during startup with:
*** fatal error - MapViewOfFileEx 'shared.5'(0x11C, size 59320, m 0, created 0), Win32 error 487. Terminating.
The same Node program and shell succeed with caching disabled. Importantly, caching itself is not the incompatible part: a task with explicit inputs and outputs executes successfully and subsequently returns a cache hit, without the automatic tracking injection.
This reproduces in a standalone directory with no application code, test runner, dependencies, or parallel workers. It reproduces when launched from either PowerShell or Git Bash.
Environment
- Windows 11 Pro, build 26200
- Vite+ global and local CLI:
1.0.0 - Node.js:
26.10.0 - Git for Windows:
2.55.0.windows.3 shresolves toC:\Program Files\Git\usr\bin\sh.exe
These are the versions tested; I have not established the first affected release.
Standalone reproduction
Create these files in a fresh directory. An existing Windows Vite+ installation and Git for Windows on PATH are sufficient; no package installation is needed for this reproduction.
package.json
{
"name": "msys-mapview-repro",
"private": true,
"scripts": {
"probe": "node probe.cjs"
}
}
pnpm-workspace.yaml
packages: []
vite.config.js
module.exports = {
run: {
cache: { scripts: true, tasks: true },
tasks: {
'probe:explicit': {
command: 'node probe.cjs',
cache: { input: ['probe.cjs', 'probe-input.txt'], output: [] },
},
},
},
};
probe-input.txt
first-input
probe.cjs
const { spawnSync } = require('node:child_process');
console.log(JSON.stringify({
node: process.version,
FSPY: process.env.FSPY ?? null,
}));
let failures = 0;
for (const [label, command] of [
['direct', 'printf shell-ok'],
['nested', 'sh -c "printf nested-ok"'],
['forks', 'for i in 1 2 3; do sh -c "printf fork-ok"; done'],
]) {
const result = spawnSync('sh', ['-c', command], {
encoding: 'utf8',
timeout: 10000,
});
console.log(JSON.stringify({
label,
status: result.status,
error: result.error?.message,
stdout: result.stdout,
stderr: result.stderr,
}));
if (result.status !== 0 || result.stderr !== '') failures++;
}
process.exitCode = failures ? 1 : 0;
Run these commands from that directory:
node probe.cjs
vp run --no-cache probe
vp run --cache probe
vp run probe:explicit
vp run probe:explicit
Expected and actual behavior
| Command | Observed result |
|---|---|
node probe.cjs |
All three shell launches succeed; FSPY is absent. |
vp run --no-cache probe |
All three shell launches succeed; FSPY is absent. |
vp run --cache probe |
FSPY=1; all three shell launches fail before their commands execute, with the MapViewOfFileEx error. |
First vp run probe:explicit |
All three shell launches succeed; FSPY is absent. |
Second vp run probe:explicit |
Successful output is replayed with cache hit. |
The failing shell processes return 3221225794 (0xC0000142, DLL initialization failure). The probe therefore exits 1. A single spawnSync('sh', ['-c', 'printf shell-ok']) is sufficient to trigger the error; the other two cases are controls, not required concurrency or nesting.
Changing the explicitly declared probe-input.txt invalidates the explicit task cache and the task executes successfully again. The probe does not read this file: it is deliberately declared as a synthetic cache input to check invalidation.
Setting FSPY=1 manually while running the program directly also succeeds, so the environment marker alone is not the trigger.
Investigation
The A/B results isolate the automatic filesystem-tracking path. In the source inspected at revision 7d69d6577ecf6bd83deee32186de59918a712873:
fspy/src/windows/mod.rsinjects the tracking DLL into the suspended process using Detours.fspy_preload_windows/src/windows/detours/create_process.rshooks process creation and propagates injection to child processes.vt/src/session/execute/mod.rs,ExecutionMode::build, enablesfspywhen either the input or output config includes automatic tracking. Explicit inputs and explicit outputs avoid that path while retaining caching.
MSYS is sensitive to its virtual-address layout and shared-memory mappings. That explains the class of failure, but I have not proven which allocation or hook causes the mapping failure inside the injected process. This report does not assume a particular native fix or claim that Windows Mandatory ASLR is the cause.
Impact and request
Cached commands that start Git/MSYS shell programs fail during child startup, even when the shell commands are trivial. Script and test harnesses that launch many such processes can emit many copies of the fatal error.
Disabling caching avoids the failure but loses cache replay. Explicit dependency declarations preserve caching and are a useful bridge, but require maintaining complete inputs and outputs. Please investigate compatibility between Windows automatic tracking/DLL injection and Git/MSYS startup, ideally retaining sound dependency tracking rather than silently skipping these processes.
AI attribution: This report was written by an AI coding assistant. The standalone reproduction and cache/no-cache comparisons were executed on the affected Windows machine; observations are distinguished above from the unverified native-level explanation.
- 主要語言
- Rust
- 星號
- 473
- 分支
- 44
- 平均合併
- 1 天 1 小時
- 30 天內合併 PR
- 63
環境準備
在瀏覽器裡用你自己的 GitHub 帳號啟動這個專案的開發容器。
- 沒有 Dockerfile 或 Docker Compose 檔案
- 沒有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
voidzero-dev/vite-task 的其他 Issue
-
難度 4/5 3-5 天 新手友好度 35/100
voidzero-dev/vite-task#822 ·
維護者通常 1 天內回覆
-
Let tools mark cache directories with CACHEDIR.TAG可能已有人在做 @lifeiscontent 於 9 天前認領。 未關閉
難度 4/5 3-5 天 新手友好度 35/100
voidzero-dev/vite-task#793 ·
維護者通常 1 天內回覆
-
Preview cache hits without running tasks可能已有人在做 @lifeiscontent 於 10 天前認領。 未關閉
難度 4/5 3-5 天 新手友好度 52/100
voidzero-dev/vite-task#791 ·
維護者通常 1 天內回覆
-
Built-in tool tasks miss the cache after the workspace moves可能已有人在做 @lifeiscontent 於 10 天前認領。 未關閉
難度 3/5 1-2 天 新手友好度 67/100
voidzero-dev/vite-task#790 ·
維護者通常 1 天內回覆
-
remote cache
難度 5/5 一週以上 新手友好度 35/100
voidzero-dev/vite-task#781 ·
維護者通常 1 天內回覆
查看 voidzero-dev/vite-task 的全部 Issue
相似的 Issue
-
install.ps1: Windows PowerShell 5.1 aborts after a successful cosign verification (NativeCommandError on 'Verified OK')可能已有人在做 @sly321-pixel 今天認領。 未關閉
難度 2/5 1-3 小時 新手友好度 76/100
維護者通常 1 天內回覆
-
ai_p2
難度 2/5 1-3 小時 新手友好度 68/100
ClickHouse/ClickHouse#125522 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 78/100
維護者通常 1 天內回覆
-
[Bug]: OpenRouter streaming chunks report the requested router name instead of the model OpenRouter served可能已有人在做 @Mrun25 今天認領。 未關閉bug llm translation
難度 2/5 1-3 小時 新手友好度 75/100
BerriAI/litellm#46095 · 1 則留言 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 62/100
cline/mcp-marketplace#2942 ·