在Matlab下利用VS调试C/C++代码

来源:互联网 发布:linux下的网络编程 编辑:程序博客网 时间:2024/06/05 06:36

在Matlab下有时需要调试C/C++代码,如在Matlab下经常调用的支持向量机(SVM)库libsvm就是用C语言编写的,如果想在Matlab下调试C代码,查看中间输出,可以利用VS。这主要涉及C/C++与Matlab的混合编程问题,有兴趣的可以自己找一下相关的资料看一下,这里只介绍Matlab下利用VS进行C/C++代码调试的步骤及其一些注意事项。

第一步:在已经打开的Matlab下要运行一个Matlab的.m文件,其中有一个文件是C/C++语言实现的,比如这里的svmtrain.c文件。现在想要调试svmtrain.c文件,那么接下来看第二步;

第二步:首先要知道的是,在Matlab下调试C/C++代码需要mex以下,至于怎样配置mex请查阅相关资料,而且是在debug版的mex,即如下:
mex -g svmtrain.c

mex svmtrain -g

参数-g即表示debug版,参数-g在前或在后无影响。经过这个步骤后便会在当前目录下生成

svmtrain.mexw64

svmtrain.mexw64.pdb

文件。因为文件名和操作系统的差异(本人操作系统是64位的,所以生成的是mexw64文件),生成的文件存在差异,但是不论怎样,肯定会生成mexw和pdb文件。

这里有一点需要注意:这里mex -g svmtrain.c均需在Matlab下的命令行窗口(Command Window)下输入,如果专门写一个脚本文件,如make文件,把这些语句放进去,虽然能够mex成功,生成所需文件,但是无法进去调试,这也许是Matlab存在的bug。

第三步:打开VS(本人这里用的是VS2013),在菜单栏点击TOOLs—>Attach to Process或直接利用快捷键Ctrl+Alt+P,然后找到正在运行的Matlab软件,点击Attach即可。如下图所示:





第三步和第二步可以交换,这两步谁先谁后看自己操作习惯。

第四步:在VS中打开要调试的C/C++文件,如svmtrain.c文件(要在Matlab当前目录下或路径中),在svmtrain.c文件中添加断点,或在Matlab中进入svmtrain函数处单步运行进入step into,注意是在Matlab窗口下调试,进入VS后两者的调试快捷键均可用。如下图所示:



在上图中,左上角可以看到Process旁边的Matlab软件及其进程号,在左下Watch1窗口可以添加要查看的变量。注意,在VS下调试时,Matlab窗口被锁定,除非在VS退出调试(Shift+F5)或调试完成。

还有一点需要注意的是:每次退出调试后,即使没有关闭VS或Matlab,想要重新调试svmtrain.c文件,需要重新按照第二步操作mex那样,否则无法进入VS下调试。


这里有一个示例供大家练习一下test.cpp:

# include "mex.h"# include "math.h"void mexFunction( int nlhs, mxArray *out[], int nrhs, const mxArray *in[] ){// Check whether the inputs are correctif ( nrhs != 2 ){        mexErrMsgTxt("test: Not correct input arguments! 2 Input Argument expected!");    }        /* Declare input variables */               mwSize N;double *b;int a;// Record the number of the first input argument// Array: bN = mxGetNumberOfElements( in[ 0 ] );b = ( double* ) mxGetPr( in[ 0 ] );// Get the scalar value: aa = ( int ) mxGetScalar( in[ 1 ] );/* Declare output variables */// Allocate the output spaceout[ 0 ] = mxCreateNumericMatrix( N + 1, 1, mxUINT32_CLASS, mxREAL );    int *c = ( int * )mxGetData( out[ 0 ] );// This is a simple example// add a to each element in b saved in c// You can write your program as you wishfor( int i = 0; i < N; i++ ){c[ i ] = b[ i ] + a;}mexPrintf("B + A Program Done: \t Array b adds value a equals to ...\n");return;    }

可以按照上述步骤,尝试一下。注意:C/C++与Matlab混编的入口函数为mexFunction,相当于通常C/C++的main函数。














参考:

Matlab + VS | Matlab2014a + VS2010 Win7 混编调试





原创粉丝点击