код отладки в автономном Matlab - PullRequest
3 голосов
/ 16 февраля 2011

Скажем, у меня есть какая-то функция foo, которая используется в автономном приложении (т.е. скомпилирована в исполняемый файл с mcc -m), который имеет важный промежуточный результат bar. Обычно мне не нужен этот промежуточный результат после завершения функции, и поэтому он не является возвращаемым значением. Однако для целей разработки и отладки полезно иметь возможность сделать этот промежуточный результат доступным, что я могу сделать, используя assignin, чтобы поместить промежуточный результат в некоторое рабочее пространство отладки.

Теперь проблема в том, что assignin невозможна в автономной компиляции и mcc будет выдавать ошибку с ошибкой, если в коде есть assignin. Что я хотел бы сделать, так это включить assignin только тогда, когда код запускается в интерактивном режиме, а не при компиляции как отдельное приложение. Кроме того, это ускорило бы работу, так как в любом случае мне не понадобился бы промежуточный результат в автономном приложении, и, следовательно, он мог бы использовать то же время и / или память, не выполняя назначение в автономном приложении. В любой другой среде программирования эту компиляцию можно вызывать в режиме отладки и выпуска.

В псевдоматлабе:

function res = foo()
  bar = some complicated formula
  if ~standalone
    assignin('debug', 'foo_bar', bar)
  end
  res = some complicated formula involving bar

Проблема в том, что я не знаю способа выражения if ~standalone, во-первых, я не знаю, как проверить, находится ли он в автономном режиме или нет, но, что более важно, это должна быть некоторая конструкция кода, которая на самом деле вызывает mcc полностью игнорировать защищенный блок кода и не пытаться скомпилировать его, поскольку назначение не может быть скомпилировано в автономном режиме.

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

Есть ли в matlab такая конструкция кода, которая позволила бы это сделать, или есть лучшая альтернатива? До сих пор я просто жонглировал закомментированный код, раскомментировал и рекомендовал отладочный код, пока шел в процессе разработки.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Вместо использования assignin для заполнения рабочей области отладки, вы можете использовать глобальную структуру отладки и хранить переменные в полях с одинаковыми именами.Все допустимые имена переменных также являются допустимыми именами структурных полей.Вы можете реализовать это с помощью глобальной переменной, но, вероятно, лучше сделать это с помощью постоянной переменной внутри функции.Это будет работать в скомпилированном или некомпилированном коде.

Во-первых, есть функция, которая определяет ваш режим отладки.

function out = isdebugging(value)
%ISDEBUGGING Get or set the global debugging state

persistent state
if isempty(state)
    state = false;
end

switch nargin
    case 0 % Getter
        out = state;
    case 1 % Setter
        state = value;
end

Затем функция для сохранения значений отладки, которая сохраняется только для значений, когда включен режим отладки.

function out = debugval(action, name, value)
%DEBUGVAL Stash values for debugging

persistent stash
if isempty(stash)
    stash = struct;
end

% Short-circuit when not in debugging mode to save space
if ~isdebugging()
    return;
end

switch action
    case 'get'
        out = stash.(name);
    case 'getall'
        out = stash;
    case 'set'
        stash.(name) = value;
    case 'list'
        out = fieldnames(stash);
    case 'remove'
        stash = rmfield(stash, name);
    case 'clear'
        stash = struct;
end

По умолчанию отладка отключена, поэтому в скомпилированной версии она закорачивается и не накапливает значения.Включите его вручную в интерактивном сеансе Matlab с помощью isdebugging (true).Это позволяет обойти проблему определения, развернуты ли вы.Это также означает, что вы можете включить и использовать его в своем скомпилированном приложении, если хотите протестировать скомпилированный код, чтобы увидеть, как он работает в этом контексте.Вы можете использовать кнопку графического интерфейса пользователя или переменную среды, чтобы сообщить скомпилированному приложению о необходимости отладки.

Вызов isdebugging () может защитить другой код.Но я бы не стал слишком увлекаться использованием isdebugging () для защиты чего-либо, кроме вывода журнала или накопления значений.Вы не хотите, чтобы ваш механизм отладки имел побочные эффекты на правильность вашего кода.

Также взгляните на log4j Java как модель того, как включить настраиваемые выходные данные отладки во время выполнения в приложение.Вы можете применить его принципы к Matlab.

1 голос
/ 16 февраля 2011

Используйте функцию isdeployed .isdeployed имеет значение true при запуске в MCR и false при запуске в MATLAB.

EDIT: Конечно, это не решает проблему компиляции.Возможно, вам придется найти замену для назначить ..

...