You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET单元测试偶发System.IO.IOException:998(无效内存访问位置)求助

排查.NET Framework 4.7.2单元测试随机IOException(998)错误的思路

错误现象与基础信息

运行.NET Framework 4.7.2项目的单元测试套件时,随机抛出以下错误:

Failed ConfMultiProjectUniqueBaseline [26 s]
Error message:
 The test method OPUS.UnitTest.NonRegressionTests.ConfMultiProjectUniqueBaseline raised an exception : 
System.IO.IOException: (998) Invalid memory access location: [C:\(...)test_plug.exe]
  • 错误无规律,可能出现在任意测试用例中
  • 重启CI/CD管道(代码完全一致)有时可正常通过
  • 测试读写路径为随机唯一目录,无跨进程读写冲突;使用MSBuild 17.2.1+52cd2da31编译,vstest.console.exe 17.2.0-preview-20220401-07(x64)运行

错误含义解析

Win32错误码998对应ERROR_NOACCESS,即无效内存访问。关联到文件操作场景时,通常是进程在尝试访问文件的过程中,出现了内存层面的异常——可能是文件句柄失效、内存页访问错误,或是测试/被测进程的内存操作越界间接影响了文件IO流程。

排查方向与解决方案

1. 清理CI环境残留状态

CI机器长期运行可能残留未释放的资源:

  • 测试开始前强制清理C:\output\下所有历史文件,避免旧文件句柄残留
  • 测试结束后添加步骤,杀死所有相关进程(如test_plug.exe、vstest.console.exe的残留实例)
  • 监控CI机器的实时资源:磁盘空间、内存使用率、IO负载,高负载状态下更易触发这类随机错误

2. 统一VSTest与MSBuild版本

当前使用的vstest是预览版(17.2.0-preview),而MSBuild是正式版(17.2.1),版本不匹配可能存在兼容性bug:

  • 将vstest.console.exe升级到与MSBuild同版本的正式版(17.2.1),或降级到之前长期稳定的版本,验证错误是否消失

3. 排查测试代码的资源泄漏

本地未出现问题但CI环境偶发,可能是多次测试运行后的资源累积泄漏:

  • 检查所有文件操作代码,确保FileStream、BinaryReader/Writer等资源都用using语句包裹,保证及时释放
  • 针对涉及test_plug.exe的测试,确认启动进程后是否调用了Process.Close()/Process.Dispose(),避免进程句柄残留
  • 在CI中添加内存监控,记录测试运行期间的内存变化,排查是否存在持续增长的泄漏点

4. 验证架构一致性

跨架构运行可能引发内存访问错误:

  • 确认test_plug.exe的目标平台与vstest.console.exe一致(均为x64),编译时统一设置项目的目标平台为x64

5. 排查系统硬件/驱动问题

随机内存访问错误可能与CI机器硬件相关:

  • 运行Windows Memory Diagnostic工具检测内存是否存在故障
  • 用磁盘检测工具检查CI机器磁盘的健康状态,排除坏道或IO控制器异常

临时缓解方案

  • 在CI管道中添加测试重试机制,遇到该错误时自动重试整个测试套件或失败的测试用例
  • 将大型测试套件拆分为多个小批次运行,降低单次测试的资源占用压力

内容的提问来源于stack exchange,提问作者Arthur Attout

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:32:34