Как мы можем отлаживать нашу созданную в Matlab DLL, используемую в приложении C++?

У нас есть файлы matlab .m, которые были скомпилированы в DLL с помощью mcc. Это используется приложением с графическим интерфейсом C++, которое мы отлаживаем в Visual Studio. Когда мы доходим до вызова нашей функции Matlab, все, что мы можем сделать, это перешагнуть через нее. Как мы можем отлаживать код .m на уровне исходного кода?

Я подумал, что было бы легко добавить некоторые операторы «печати», которые в Matlab на самом деле называются «disp», и смотреть, как материал прокручивается в окне вывода VS. Но мы ничего не видим. Даже из printf() в исходном коде C++ или при запуске нашего приложения непосредственно из командной строки, а не в VS. Из Google и S.O. мы узнаем, что ничего, отправленное на стандартный вывод, никогда и нигде не появляется. (Этот вопрос актуален: Стандартный вывод Visual Studio 2012 C++, но у нас это не сработало.)

Я попробовал msgbox('бла-бла') в сценариях .m и пересобрал DLL. Ничего не появилось. Я не уверен, должно ли это работать, но наш код Matlab не выполнялся, или если ожидается, что msgbox не будет работать в этой ситуации, например, stdout.

Мы были бы довольны отладкой на основе печати. Точки останова и другие методы были бы хороши, но в настоящее время в этом нет необходимости.

Мы используем Matlab R2016b на Win7, Visual Studio 2015. У нас есть источник .m, используемый для создания DLL, и у нас есть источник для приложения с графическим интерфейсом, использующего DLL.


person DarenW    schedule 22.12.2016    source источник


Ответы (1)


Несколько предметов:

  1. Когда вы вызываете процедуру инициализации вашей dll, вызовите сгенерированную версию «WithHandlers»: YourDllInitWithHandlers( **, **). '**' - это заполнители для функций, принимающих сообщения matlab disp/warn/error, которые вы можете направить на stdout, OutputDebugString или log по своему усмотрению.

  2. Возможно, вы инициализировали mcr из своего кода с опцией -nojvm? Если это так, окна сообщений не будут отображаться.

  3. Вы не можете войти в исходные коды .m скомпилированных библиотек. Мы используем два варианта: (а) сохранить входные данные для вашего скомпилированного кода в виде файлов mat, затем загрузить и отладить на досуге в Matlab. (b) Переключение между вызовом скомпилированной библиотеки DLL и вызовом Matlab-Engine. Этот набор API позволяет запускать, контролировать и вызывать полностью интерактивный рабочий стол Matlab. Вы можете установить точки останова и шаг, как в обычном сеансе Matlab. Это требует дополнительного кода установки, но очень удобно для отладки.

person Ofek Shilon    schedule 05.04.2017