告别mex崩溃调试法: 借助visual studio调试

原文网页:https://zhuanlan.zhihu.com/p/34648899
MATLAB中MEX文件的编写与调试
mex是MATLAB运行C/C++代码的一种手段, 一旦完成, 使用方法和普通的MATLAB函数是一样的.之所以使用它, 主要目的是为了提速. 当你使用了一切MATLAB技巧(向量化, 并行循环, profiler等), 速度还是不够快的时候, mex是一个大杀器(当然, 大杀器不能轻易使用 ) , 因为你要用C/C++语言来写, 一般比较花时间, 使用MATLAB的人一般就是看重MATLAB的快速编程优势)

mex一般有两种生成方法:
第一种, 借助coder, 自动生成mex

优势是: 1 快速生成 2 一般是没有bug的

缺点: 1部分MATLAB函数不被coder不支持 2 生成的mex速度有可能还不如MATLAB的普通函数. 原因是自动化生成的东西, 有大量冗余在里面.

第二种, 自己手工写C/C++代码, 或者网上下载C/C++, 修改成mex接口.
优势是: 1 运行速度一般比较快(只要代码写得不要太烂了)

缺点是: 1 比较耗时(你懂的, 同样的功能, C/C++的代码长度比MATLAB代码长的多)

2 容易产生bug

关于怎么尽量避免bug, 我的经验做法是:

写C/C++的风格的MATLAB代码, 完成算法, 并且调通. 然后直接翻译成C/C++.

所谓的"C/C++的风格的MATLAB代码"指的是:

1 不要用向量化, 满屏幕的for循环嗨起来.

2 不要用高级函数, 使用基本函数(C/C++有对应的函数, 比如四则运算, 三角函数等)

使用了这种方法写mex, 出bug的几率就很小了.

但是写完了C/C++, 并转换成了mex, 运行时, 发现某些corner cases产生了bug, 怎么办呢?

如果是昨天的我, 会将这些corner cases保存成文件, 然后写一个main函数, 读取文件, 然后按照C/C++的debug基本流程来debug.

但是这是一种比较间接的方法. 今天读了一下MATLAB的mex相关的文档, 学到了一招, 可以直接调试. 也就是这篇文章的主题.
第一步, 命令窗口输入:

mex -g yprime.c

注意, 通常我们编译成mex文件, 使用的命令是:

mex yprime.c

多输入了"-g"

生成了两个文件: “yprime.mexw64"和"yprime.mexw64.pdb”

第一个文件不意外, 就是我们需要的mex文件, 第二个文件我第一次见到, 看最后结尾".pdb", 应该是用来调试, 符合我的debug意图.
第二步, 打开mex设置版本的visual studio:

第三步, “调试”," 附加到进程", 就会出现下面的对话框或者直接使用“搜索”:
在这里插入图片描述
选中MATLAB.exe, 然后点"附加"

第四步, “文件”, “打开”, 选中"yprime.c"

第五步, 想要设置断点的行设置断点

这个就不细说了, 这个都不知道的读者可能不适合使用mex了.

第六步, 运行mex文件.

yprime(1, 1:4);

可以看到visual studio在断点出停住了.
在这里插入图片描述
第七步, visual studio的常规debug操作了.

第八步, 找到出错源代码, 改正后, 再生成mex

第九步, 如果还是出错. 那么第一步到第八步再来一遍.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值