Как вызывать ошибку при вызове fprintf или disp?

У меня есть большая библиотека непроницаемого кода, которая выписывает действительно раздражающие строки. Кажется, я не могу найти, где они, по какой-то странной причине. Поэтому я думал, что если бы я мог заставить MATLAB вызывать ошибку при вызове sprintf или disp, я мог бы найти их. Есть ли способ сделать это?

Я пробовал evalc, но все, что он дает, это сам вывод не от того, где он был вызван.

4 ответа

dbstop in

Уверен, вы можете перегрузить 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, <b>the debugger will stop at the point right before "libmwbuiltins>disp"</b> 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, <b>the debugger will stop at the point right before "libmwbuiltins>fprintf" is called.</b>

Хорошо выглядеть!

Рассмотрим следующую тестовую функцию 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 вызывается в строке 6 из testdbstop.m в testdbstop>fprintTest, вызванной из строки 4 из testdbstop.

Примечание. Когда вы закончите, удалите виртуальные точки останова с помощью dbclear (т.е. dbclear in disp и dbclear in fprintf).


Я бы не рекомендовал выбросить ошибку. Например, disp вызывается workpacefunc всякий раз, когда вы выходите из отладчика. Установка точки останова упрощает, если вы хотите, чтобы ошибка заменила keyboard на ошибку.

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

Поместите этот диспетчер поверх своего пути, он вызовет встроенный, таким образом, вы увидите, что было напечатано и остановилось после этого. Сделайте то же самое для fprint


Что вы можете сделать, это написать свою собственную функцию disp() (которая может вызвать ошибку с функцией error()), сохраните ее как disp.m в текущем пути Matlab. Это переопределит встроенный disp() и позволит вам найти, где он вызывается.

В качестве альтернативы вы можете открыть все файлы в своей библиотеке в виде Notepad ++ и выполнить поиск по всем открытым файлам для термина 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:\Users\MyName\Documents\MATLAB\fprintf.m   C:\Program Files (x86)\MATLAB\R2009a\toolbox\matlab\iofun\@serial\fprintf.m% последовательный метод   встроенный (C:\Program Files (x86)\MATLAB\R2009a\toolbox\matlab\iofun\fprintf)% Shadowed

Поиск недостающих точек с запятой, которые создают переменные, сложнее, поскольку существует множество различных методов disp.

licensed under cc by-sa 3.0 with attribution.