使用Google.OrTools.Sat的CpSolver.Solve触发AccessViolationException
问题描述
我正在跟随一个Python教程视频将代码转成.NET版本,但程序一运行就崩溃。精简出最小复现代码后问题仍存在,尝试用GC.KeepAlive也无法阻止崩溃。请问是否有遗漏的配置?
复现代码(program.cs)
using Google.OrTools.Sat; // 版本9.10.4067 var model = new CpModel(); var solver = new CpSolver(); solver.Solve(model); // 尝试阻止崩溃 GC.KeepAlive(model); GC.KeepAlive(solver);
错误输出
%USER_PROFILE%\AppData\Local\Programs\Rider\plugins\dpa\DotFiles\JetBrains.DPA.Runner.exe --handle=14376 --backend-pid=6556 --etw-collect-flags=67108622 --detach-event-name=dpa.detach.14376 %LOCAL_PATH%/ConsoleApp1/bin/Debug/net7.0/ConsoleApp1.exe Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. Repeat 2 times: -------------------------------- at Google.OrTools.Sat.operations_research_satPINVOKE.SolveWrapper_Solve(System.Runtime.InteropServices.HandleRef, Int32, Byte[]) -------------------------------- at Google.OrTools.Sat.SolveWrapper.Solve(Google.OrTools.Sat.CpModelProto) at Google.OrTools.Sat.CpSolver.Solve(Google.OrTools.Sat.CpModel, Google.OrTools.Sat.SolutionCallback) at Program.<Main>$(System.String[]) Process finished with exit code 0xC0000005.
项目文件
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Google.OrTools" Version="9.10.4067" /> </ItemGroup> </Project>
解决方案
针对这个崩溃问题,可以尝试以下几个排查和修复步骤:
给模型添加至少一个变量或约束:空模型会触发底层C++库的未定义行为,导致内存访问错误。添加简单的变量和约束即可避免,示例代码:
using Google.OrTools.Sat; var model = new CpModel(); // 添加变量和约束 var x = model.NewIntVar(0, 10, "x"); model.Add(x > 5); var solver = new CpSolver(); solver.Solve(model);设置正确的平台目标:Google OR-Tools主要支持x64架构,确保项目生成选项里的平台目标设置为
x64,避免使用Any CPU导致的跨平台兼容问题。升级OR-Tools版本:尝试更新
Google.OrToolsNuGet包到最新版本,新版本可能修复了空模型导致的崩溃bug。避开Rider的DPA工具启动:错误输出显示程序是通过JetBrains DPA性能分析工具启动的,该工具可能与OR-Tools的原生库存在交互冲突。直接运行输出目录下的
ConsoleApp1.exe,而非通过Rider的DPA工具启动。
内容的提问来源于stack exchange,提问作者Adam Straughan
相关产品推荐
相关产品推荐

