仅在调试期间在 C++ 中初始化 matlab-compiler dll / lib 时访问冲突

Posted

技术标签:

【中文标题】仅在调试期间在 C++ 中初始化 matlab-compiler dll / lib 时访问冲突【英文标题】:Access violation while initializing matlab-compiler dll / lib in c++ only during debugging 【发布时间】:2017-06-22 21:27:03 【问题描述】:

我想要做的是将 MATLAB-Compiler dll/lib 集成到新的 c++ 项目中。

我按照以下说明进行操作:How do I integrate my C++ shared Library generated from MATLAB 哪些接缝运行良好(没有构建错误并且智能感知运行良好,因此它可以接缝所有必需的信息)。

我正在使用一个非常简单的 mathlab 代码/函数进行测试:

function output = extest( arg1,arg2 )
    output = arg1+arg2;
end

以及 matlab 函数的“默认”c++ 代码:

#include "extest.h"
#include <cstdlib>
#include <stdio.h>

int main(int argc, char** argv)

    mclmcrInitialize();
    if (!mclInitializeApplication(NULL,0))

        std::cerr << "could not initialize the application properly" << std::endl;
        return -1;
    
        if(!extestInitialize())
            std::cerr << "could not initialize the library properly" << std::endl;
            return -1;
        
        else
            try

                //code itself (not jet reached therefore removed)

            catch(const mwException& e)
              std::cerr << e.what() << std::endl;
              return -2;
            
            catch(...)
              std::cerr << "Unexpected error thrown" << std::endl;
              return -3;  
            
            extestTerminate();
        
        mclTerminateApplication();
        return 0;

在调试器尝试运行 if(!extestInitialize()) 行之后的 e 片刻之后,将引发以下错误。

在 DllTestingCpp.exe 中的 0x000002BF72E0EE55 处引发异常:0xC0000005:访问冲突读取位置 0x0000000000000008。

我可以点击 Visual Studios continue &gt; 按钮,并且在点击 20 次后继续。通过ctrl + F5 启动代码(无需调试)一切正常。

任何想法为什么会在调试模式下发生这种情况?或者更好的方法是如何摆脱这个错误?

PS:extest 是我的库名称,使用 Matlab R2017a 64 位和 Visual Studio 2017(使用 x64 调试),

【问题讨论】:

我在部署 .net 程序集后遇到了类似的错误。看看here。尝试在 matlab 上禁用 jit。这里有几个链接。 link1,link2。不过,我不确定这与 c++ 有多大的相关性.. 嗨,是的,它看起来非常相似,但我不确定如何在 c++ 中使用该解决方案 在启动 matlab 编译器时关闭 jit 可能是一个开始,这不取决于您是否为 C# 的 C++ 编译。 不,没有变化。即使我通过feature accel off 关闭“JIT”,错误仍然存​​在,如此处所述de.mathworks.com/matlabcentral/newsreader/view_thread/237478 我确实修改了它。 【参考方案1】:

对我来说同样的问题(Matlab2017 + VS 2015)。 可能与MATLAB使用的java有些冲突。

我已经解决了

const char *args[] = "-nojvm";
const int count = sizeof(args) / sizeof(args[0]);
mclInitializeApplication(args, count))

而不是

mclInitializeApplication(NULL,0)

【讨论】:

你会丢失 Matlab 的 UI(从 C++ 调用它时你真的需要它们吗?),但无论如何它比访问冲突更好【参考方案2】:

我遇到了同样的问题(使用 VS2019),我在这里找到了以下答案: https://uk.mathworks.com/matlabcentral/answers/182851-how-do-i-integrate-my-c-shared-library-generated-from-matlab-r2013b-in-visual-studio-2013

我遇到了同样的问题并将其报告给 Mathworks。他们回应说,对于 VS2013 及更高版本,调试器设置为在 0xc0000005 发生时中断,即使在这种情况下它是由 JVM 处理的。 修复方法是转到“调试”>“Windows”>“异常设置”>“Win32”并取消选中“0xc0000005 访问冲突”。在VS2012中,这个设置默认是不勾选的。

这似乎工作正常。

【讨论】:

以上是关于仅在调试期间在 C++ 中初始化 matlab-compiler dll / lib 时访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 调试期间未加载 atio6axx.pdb [重复]

Visual Studio c++ 仅在调试模式下 LNK 1104 错误

C ++添加仅在调试时运行的调试代码

仅在 Flutter 的调试模式下运行的应用程序

在 C++ 中的数组初始化期间使用数组成员 [重复]

Scala:代码仅在调试时运行(#ifdef 等效?)