尝试读取或写入受保护的内存异常在没有调试的情况下发生,但没有调试



这个问题的导数肯定有人问过,但我还没有找到一个符合我的情况的。

我创建了一个库,它正在封装第三方C++库,并将其提供给一些内部系统。创建的库使用C++/CLI允许用户通过C#访问它。该库可以使用我们的内部持续集成NuGet服务器构建并启动,因此可以使用。

当使用"启动调试"(F5)运行程序时,在其他应用程序/系统中使用此库没有问题,但无论何时使用"启动而不调试"(Ctrl+F5)或通过可执行文件运行,都会引发以下异常:

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at TheirLib.func(Int32 , Int32 , Double* , Int32 , Int32* , Int32* , Double* , Int32 , TheirLibError* )
at MyLib.Func(Int32 n, Int32 m, Double[] x, Int32 tdx, Int32[] svar, Int32[] sobs, Double[] corr, Int32 tdc)
at SomeApplication.Program.Main(String[] args) in d:SomeApplicationSomeApplicationProgram.cs:line 67

我在这里阅读(https://connect.microsoft.com/VisualStudio/feedback/details/819552/visual-studio-debugger-throws-accessviolationexception)可能需要.NET 4.5.2,但这并没有改变任何事情。我还认为我的C++/CLI库中可能有一些设置可以让我绕过这个问题,但我什么都找不到,我觉得我到处都找遍了。我还查看了准备在调用第三方库时使用的pin_ptr对象的C++/CLI代码,但一切看起来都很好(见下文)。

void MyLib::Func(int n, int m, array<double>^ x, int tdx, array<int>^ svar, array<int>^ sobs,
    array<double>^ corr, int tdc)
{
    // Setup input parameters
    pin_ptr<double> xPtr = &(x[0]);
    pin_ptr<int> svarPtr = &(svar[0]);
    pin_ptr<int> sobsPtr = &(sobs[0]);
    pin_ptr<double> corrPtr = &(corr[0]);
    TheirLibError fail;
    // Call their library's function
    func(n, m, xPtr, tdx, svarPtr, sobsPtr, corrPtr, tdc, &fail);
}

同样,该库与"开始调试"完全一样,并通过了一组详尽的测试,但我无法理解为什么它不能独立运行。。。在这一点上,我会尽一切努力让它发挥作用。帮帮我吧,你是我唯一的希望。。。

联系库所有者后,问题是TheirLibError没有正确初始化,并且该结构中包含的指针在库中没有得到正确处理。在正确初始化它之后,一切都如预期的那样工作。

故事的寓意是,当遇到AccessViolationException时,向库所有者询问他们的库是否保留指针或任何其他指针行为。

相关内容

最新更新