標籤:

告別mex崩潰調試法: 藉助visual studio調試

mex是MATLAB運行C/C++代碼的一種手段, 一旦完成, 使用方法和普通的MATLAB函數是一樣的.之所以使用它, 主要目的是為了提速. 當你使用了一切MATLAB技巧(向量化, 並行循環, profiler等), 速度還是不夠快的時候, mex是一個大殺器(當然, 大殺器不能輕易使用 :) , 因為你要用C/C++語言來寫, 一般比較花時間, 使用MATLAB的人一般就是看重MATLAB的快速編程優勢)

mex一般有兩種生成方法:

第一種, 藉助coder, 自動生成mex

優勢是: 1 快速生成 2 一般是沒有bug的

缺點: 1部分MATLAB函數不被coder不支持 2 生成的mex速度有可能還不如MATLAB的普通函數. 原因是自動化生成的東西, 有大量冗餘在裡面.

我在這篇文章裡面也介紹過一點coder.

芷菡:完全沒辦法看內置函數的源代碼了嗎??

zhuanlan.zhihu.com圖標

第二種, 自己手工寫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

第九步, 如果還是出錯. 那麼第一步到第八步再來一遍.


推薦閱讀:

Eigen 矩陣運算庫在實際項目中的使用情況如何?
Matlab初學之(一)
Cody簡介
為什麼matlab學生版不向中國發售?如何才能在國內買到學生版的matlab?
請通俗易懂地解釋一下guidata()的用法?以及他是如何幫助參數在GUI間傳遞的?

TAG:MATLAB |