[万能解决问题]MATLAB has encountered an internal problem and needs to close.

时间:2022-05-26 06:44:16

1.错误的描述及解决办法

使用Matlab和C++混合编程时,即编写完mex文件,调用时,经常会提示下面的错误:
[万能解决问题]MATLAB has encountered an internal problem and needs to close.

触发上述错误的情况:
1.如果一进入mexFunction函数就报错,即不会命中函数中设置的任何断点,也会报错,那么说明,你忘记了将mex -O 改称为mex -g,并且程序本身也有问题。
2.mex指令编译mex文件时,链接使用的库不对(虽然可以编译成功),,但在使用时也会报错,例如在mexFunction中使用String等其他类型不会报错,一使用Mat对象就会报错,原因是应该使用opencv的release版本的库,却使用了OpenCV的debug版本的库。
3. mex文件在.m文件中调用,第一次运行.m文件不会报错,第二次运行.m文件就会触发mex文件中的错误。
4. 更加离谱的是:mex文件在.m文件中调用,多次运行不会报错。但是,如果在另外一个.m文件中调用含有mex文件的.m文件,则会发生,多次运行另外一个.m文件会触发错误。
5. 或者还存在其他千奇百怪的错误。

那么怎么解决这样的问题呢?
千万不要指望通过调试mex文件的方式来解决。即通过将mex文件通过vs打开,并且通过vs将matlab进程添加进去的方式来跟踪,这样可能一无所获,而且一运行到某个地方就会使得matlab崩溃。
http://cn.mathworks.com/help/matlab/matlab_external/debugging-on-microsoft-windows-platforms.html

解决方法:
Matlab报错,肯定是自己程序的原因。如变量未初始化就使用了,或者野指针,空指针,或者就是除以0等。万能的解决方法,就是产生同Matlab同样的数据,即利用同样的数据,完全在VS中进行调试,VS编译器会给你一个合理的报错解释,而不像Matlab那样

其他

Matlab/C++混合编程时,出现:
Matlab has encountered an internal problem and needs to close.
The unsaved information you were working on may be lost. We are sorry for the inconvenience.
Click End Now to close Matlab now.

….
使用VS2010在mexFuntion.cpp文件中设置断点调试时,有时会报错,有时候又可以通过。就有可能会出现这样的情况:使用mex指令对mexFuntion.cpp编译后,在matlab程序中调用该函数,第一次执行时,程序不报错,当在执行第二次时,就会报错。

报错的原因就是,如:空指针,变量为分配内存而使用….

例如:

vector<int> vec;
vec[0]=1;//error, 未分配内存。
vec[1]=2;
mxArray *ptr=mxGetField(prhs[0],0,'name');
//if ptr==NULL或者0
char *strName=mxArrayToString(ptr);
typedef struct person
{
int age;
char name[10];
}Person;
typedef struct man
{
int sex;
Person *p;
}Man;

Man* pMan=(Man *)malloc(sizeof(Man));
//use pMan
pMan->p->age=10;//error,变量age没有分配内存.可以将Man中的成员Person *p改为Person p.

2.在mex.cpp文件的入口函数mexFunction处设置断点,但是程序不跑断点直接出错原因是在mex编译的时候,需要将mex -o改成 mex -g。(有时候改来改去忘了改回来,经常犯这样的错误)。

3.在使用compile.m文件对mex.cpp进行编译的时候,有时候编译能够成功,而且还通过了,但是在进行调试的时候会出现莫名其妙的错误,同上一样也是出现下面的错误:
Matlab has encountered an internal problem and needs to close.

此时,如果不是上面类似的内存泄漏的话,那问题就在于compile.m的编译了。
例如,在compile.m文件中用到了OpenCV的lib,我们采用了带d的:

opencvLibs = ' -lopencv_core249d -lopencv_highgui249d -lopencv_imgproc249d ';

则程序调用plhs[0]=MxArray(mat)时候就会报错,即将mat类型的对象转换为plhs[0]时会报错,但是将plhs[0]=MaxArray(string)时候正常运行,即将string类型的对象转换为plhs[0]时不会报错。然而我将用的OpenCV lib改为:

opencvLibs = ' -lopencv_core249 -lopencv_highgui249 -lopencv_imgproc249 ';

程序正常运行。