使用 fopen 文件时,matlab 在没有转储文件的情况下崩溃

Posted

技术标签:

【中文标题】使用 fopen 文件时,matlab 在没有转储文件的情况下崩溃【英文标题】:matlab crashes without dump file when using fopen for file 【发布时间】:2015-02-12 06:06:14 【问题描述】:

我正在使用带有 mingw 的 gnumex 在 Windows 操作系统的 matlab 中编译 mex 文件。我无法使用 fopen 命令打开文件。以下是我正在使用的代码。

#include <stdio.h>
#include "mex.h"
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

    FILE  *fp=NULL;
    fp = fopen("test.txt", "w+");

程序编译成功,但是当我尝试运行 compile mexw64 文件时,matlab 只是关闭而没有生成任何转储文件。

请注意,我能够运行简单的 Hello world 程序并使用其他 mex 程序传递和接收参数。

更新 1:添加 flcose(fp) 不会改变行为。

更新 2:我无法使用 http://www.mathworks.com/help/matlab/matlab_external/debugging-on-microsoft-windows-platforms.html 进行调试,因为我正在使用 mingw 以及 windows 中的 gnumex 设置进行编译

更新 3:

的输出
mex -v file.cpp

 This is mex, Copyright 1984-2007 The MathWorks, Inc. 


-> Default options filename found in C:\Users\achaudhary\AppData\Roaming\MathWorks\MATLAB\R2009b 
---------------------------------------------------------------- 
->    Options file           = C:\Users\achaudhary\AppData\Roaming\MathWorks\MATLAB\R2009b\mexopts.bat 
      MATLAB                 = C:\PROGRA~1\MATLAB\R2009b 
->    COMPILER               = gcc 
->    Compiler flags: 
         COMPFLAGS           = -c -DMATLAB_MEX_FILE -x c++ 
         OPTIMFLAGS          = -O3 
         DEBUGFLAGS          = -g 
         arguments           =  
         Name switch         = -o 
->    Pre-linking commands   =  
->    LINKER                 = C:\PROGRA~1\MATLAB\R2009b\sys\perl\win32\bin\perl.exe E:\MATLAB~1\linkmex.pl 
->    Link directives: 
         LINKFLAGS           =   -mwindows -LC:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex GM_ISCPP   -mwindows 
         LINKDEBUGFLAGS      = -g  -Wl,--image-base,0x28000000\n 
         LINKFLAGSPOST       =  
         Name directive      = -o file.mexw64 
         File link directive =  
         Lib. link directive =  
         Rsp file indicator  =  
->    Resource Compiler      = C:\PROGRA~1\MATLAB\R2009b\sys\perl\win32\bin\perl.exe E:\MATLAB~1\rccompile.pl --unix -o mexversion.res 
->    Resource Linker        =  
---------------------------------------------------------------- 


--> gcc  -c -DMATLAB_MEX_FILE -x c++ -oC:\USERS\ACHAUD~1\APPDATA\LOCAL\TEMP\MEX_FZ~1\file.obj -IC:\PROGRA~1\MATLAB\R2009b\extern\include -IC:\PROGRA~1\MATLAB\R2009b\simulink\include -O3 -DMX_COMPAT_32 file.cpp 


--> C:\PROGRA~1\MATLAB\R2009b\sys\perl\win32\bin\perl.exe E:\MATLAB~1\linkmex.pl -o file.mexw64   -mwindows -LC:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex GM_ISCPP   -mwindows -s  C:\USERS\ACHAUD~1\APPDATA\LOCAL\TEMP\MEX_FZ~1\file.obj   

link command: g++ -shared C:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex\mex.def -o file.mexw64 -mwindows -LC:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex  -mwindows -s C:\USERS\ACHAUD~1\APPDATA\LOCAL\TEMP\MEX_FZ~1\file.obj -llibmx -llibmex -llibmat 

编辑 我现在可以使用 minGw,但 cygwin 仍然存在问题。仍然没有找到使用 cygwin 的解决方案。

【问题讨论】:

没有fclose?我认为您在这里的帖子过于简单化了。请务必使用以 NULL 结尾的字符串。 你试过调试你的 mex 文件吗? mathworks.com/help/matlab/matlab_external/… @chappjc 这是 mex 文件中的完整代码。没有过于简单化。请让我在哪里需要确保使用 NULL 终止的字符串。 我知道 fclose 没有帮助,它只是看起来可疑地缩短了。无论如何,您可以使用gdb 进行调试。 问题可能与文件权限有关吗?可以读取文件吗?会不会是文件路径格式的问题? 【参考方案1】:

查看了 windgb 调试器,发现 mex 文件也在使用早期安装的 cygwin64 库。为了使之前的安装工作,我不得不从 gnumex 手动生成的 mexopts.bat 中删除 -mno-cygwin 标志,因为它与安装的 gcc 版本不兼容。不知何故,除了 FILE open 之外的一切都正常工作。

全新安装 mingw64 并相应地附加环境路径也是如此。然后使用 mingw64 重新安装了 gnumex,现在使用 minGw 一切正常。

注意:使用 cygwin 时问题仍然存在。

【讨论】:

以上是关于使用 fopen 文件时,matlab 在没有转储文件的情况下崩溃的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB---fopenfprintf函数

17.matlab中各种文件的I/O操作2——fopen操作

为啥核心转储?

分段错误(核心转储)

matlab中fopen问题

在Matlab中打开多个文件