我有一個不可穿透代碼的大型庫,它寫出了非常令人討厭的換行符。我似乎無法找到他們出於某種奇怪的原因。所以我一直在想,只要調用sprintf
或disp
,我就可以讓MATLAB發生錯誤,我可以找到它們。有沒有辦法做到這一點?如何調用fprintf或disp時發生錯誤?
我試過evalc
,但它給出的只是輸出本身,而不是它被調用的地方。
我有一個不可穿透代碼的大型庫,它寫出了非常令人討厭的換行符。我似乎無法找到他們出於某種奇怪的原因。所以我一直在想,只要調用sprintf
或disp
,我就可以讓MATLAB發生錯誤,我可以找到它們。有沒有辦法做到這一點?如何調用fprintf或disp時發生錯誤?
我試過evalc
,但它給出的只是輸出本身,而不是它被調用的地方。
當然,你可以重載disp
或fprintf
,或者你可以告訴調試器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.m
和fprintf
在testdbstop.m
的第6行調用testdbstop>fprintTest
,由testdbstop
的第4行調用。
注意:完成後,使用dbclear
(即dbclear in disp
和dbclear in fprintf
)刪除虛擬斷點。
我不會推薦拋出一個錯誤。例如,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
你可以做的是編寫你自己的disp()函數(它可以用error()函數產生一個錯誤),將它保存爲當前的Matlab路徑中的disp.m。這將覆蓋內置的disp()&,允許您找到它的調用位置。
或者,你可以在像記事本+ +打開書架中的所有文件,並在所有打開的文件搜索術語「DISP(」
製作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方法,所以缺少使變量變量的分號更加困難。
謝謝!那就是訣竅。 –