2011-06-01 89 views
4

我編譯了一個C++代碼到MEX文件,但是在調用這個MEX文件時,它崩潰了。 它使MATLAB中的以下錯誤消息:mex文件崩潰了,如何在matlab中使用MATLAB_MEM_MGR?

段違規檢測

我嘗試使用try-catch代碼在C++中的文件打印在catch塊 像消息,

try { 
    //my code; 
} 
catch(std::exception &e) 
{ 
    mexPrintf(e.what()); 
    mexEvalString("drawnow;"); 
    return; 
} 

但打印消息不起作用,代碼仍然崩潰。

地看着谷歌,大部分時間它指向某種形式的消息MathWorks公司給出的:http://www.mathworks.de/matlabcentral/newsreader/view_thread/25900

它指示設置可變環境"MATLAB_MEM_MGR=debug", 但它沒有解釋如何使用它?任何人都可以請解釋嗎?

回答

4

首先,try/catch不會觸發分段衝突。它只捕獲C++異常,而不是像sigsegv這樣的信號。

其次,以 「用」 MATLAB_MEM_MGR

  1. 設置環境變量MATLAB_MEM_MGR爲 「調試」 在OS殼(如在Windows命令提示符或UNIX上的終端),
  2. 運行MATLAB從相同的外殼,
  3. 通常從該MATLAB運行您的MEX函數。

由於常見問題的Q3.5說,如果MEX-功能由(例如)書寫破壞記憶一個懷舊的MATLAB分配塊的結尾,MATLAB將報告腐敗行爲時的內存塊被釋放。

您可能不想嘗試在調試器下運行MEX函數。 This tech note有幾個鏈接描述如何在各種平臺上這樣做。

編輯:以前的鏈接已經死了,這裏是最新的doc page

+0

嗨,我可以解決這個問題。由於錯誤的輸入格式,我得到了崩潰,錯誤的格式導致零分。 – 2011-06-04 00:56:59

+0

發佈此消息之前,我曾嘗試用cpp調試代碼,但是我無法捕捉它。正如我所提到的,我嘗試過使用try catch,printing等等。而且,我從來沒有想過這次崩潰可能是由於零分,因此我所有的努力都是要看看我是否試圖訪問額外的內存。無論如何,謝謝。 – 2011-06-04 01:00:17

0

刪除mexEvalString("drawnow;")。我花了5個小時才弄清楚這一點。