2014-01-30 3 views
4

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

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

ответ

2

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, 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 

Там у Вас есть это - дисп называется на линии 3 testdbstop.m и fprintf вызывается по строке 6 из testdbstop.m в testdbstop>fprintTest, вызывается по строке 4 из testdbstop.

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

2

Я бы не рекомендовал выбросить ошибку. Например, disp вызывается workpacefunc всякий раз, когда вы выходите из отладчика. Установка точки останова упрощает, если вы хотите, чтобы ошибка заменила ошибку 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()), сохраните ее как disp.m в текущем пути Matlab. Это переопределит встроенный disp() &, позволяющий найти, где он вызывается.

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

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

Смежные вопросы