2014-01-30 30 views
4

我有一個不可穿透代碼的大型庫,它寫出了非常令人討厭的換行符。我似乎無法找到他們出於某種奇怪的原因。所以我一直在想,只要調用sprintfdisp,我就可以讓MATLAB發生錯誤,我可以找到它們。有沒有辦法做到這一點?如何調用fprintf或disp時發生錯誤?

我試過evalc,但它給出的只是輸出本身,而不是它被調用的地方。

回答

2

dbstop in

當然,你可以重載dispfprintf,或者你可以告訴調試器dbstop停止在這些功能。然後使用dbstack來查看你在哪裏以及如何到達那裏。沒有MATLAB代碼就可以內建這些代碼。它會在通話前停下來:

 
>> dbstop in disp 
Warning: MATLAB debugger can only stop in MATLAB code files, and "libmwbuiltins>disp" is not a MATLAB code file. 
     Instead, the debugger will stop at the point right before "libmwbuiltins>disp" is called. 

>> dbstop in fprintf 
Warning: MATLAB debugger can only stop in MATLAB code files, and "libmwbuiltins>fprintf" is not a MATLAB code file. 
     Instead, the debugger will stop at the point right before "libmwbuiltins>fprintf" is called. 

看起來不錯!

請看下面的測試功能testdbstop與嵌套函數fprintTest

function testdbstop 
x=1; 
disp(x) 
fprintTest(x) 
    function fprintTest(x) 
     fprintf('%d\n',x); 
    end 
end 

在命令行中運行它:

>> testdbstop 
3 disp(x) 
K>> dbstack 
> In testdbstop at 3 
K>> dbcont 
    1 
6   fprintf('%d\n',x); 
K>> dbstack 
> In testdbstop>fprintTest at 6 
    In testdbstop at 4 
K>> dbcont 
1 

有你有它 - DISP叫上3行testdbstop.mfprintftestdbstop.m的第6行調用testdbstop>fprintTest,由testdbstop的第4行調用。

注意:完成後,使用dbclear(即dbclear in dispdbclear in fprintf)刪除虛擬斷點。

2

我不會推薦拋出一個錯誤。例如,disp退出調試器時由workspacefunc調用。設置斷點使得它更容易,如果你想要一個錯誤代替keyboard出錯。

function disp(varargin) 
builtin('disp',varargin{:}); 
x=dbstack; 
%it's nessecary to exclude all calls which come via workspacefunc, 
%otherwise it's impossible to quit the debugger. 
if numel(x)>2&&strcmpi(x(2).file,'workspacefunc.m') 
    return; 
end 
keyboard; 
end 

將這個disp.m你的路徑之上,它會調用內置的,所以你看到的是什麼印刷和隨後停止。做同樣的事情fprint

+0

謝謝!那就是訣竅。 –

1

你可以做的是編寫你自己的disp()函數(它可以用error()函數產生一個錯誤),將它保存爲當前的Matlab路徑中的disp.m。這將覆蓋內置的disp()&,允許您找到它的調用位置。

或者,你可以在像記事本+ +打開書架中的所有文件,並在所有打開的文件搜索術語「DISP(」

0

製作fprintf拋出一個錯誤,是很容易的,因爲沒有超載爲fprintf方法

您可以陰影像這樣內置fprintf通過創建在當前目錄下一個新的函數調用fprintf.m(總是在Matlab路徑最高)功能應包含代碼:。

function fprintf(varargin) 
error('Error message to help find fprintf statements') 

現在,當您運行不可穿透的代碼時,每當調用fprintf時都會收到錯誤。

如果不可穿透的代碼改變目錄,新的fprintf.m可能不會被調用。在這種情況下,我會將您的自定義fprintf.m代碼放在matlab路徑上的文件夾中,該文件夾的路徑高於Matlabs fprintf函數。您可以檢查,這是在命令行給這個指令高:

which fprintf -all 

Matlab的內置函數應該陰影和你應該在最前面。它應該是這個樣子:

其中fprintf中-all C:\用戶\ MYNAME \文檔\ MATLAB \ fprintf.m C:\ Program Files文件(x86)的\ MATLAB \ R2009a \工具箱\ MATLAB \ iofun \ @serial \ fprintf.m%串行方法 內置(C:\ Program Files文件(x86)的\ MATLAB \ R2009a \工具箱\ MATLAB \ iofun \ fprintf中)%盯梢

查找因爲有很多不同的disp方法,所以缺少使變量變量的分號更加困難。

相關問題