我们有matlab .m文件,它们已使用mcc编译为DLL。这由我们在Visual Studio中调试的C ++ GUI应用程序使用。当我们到达对matlab函数的调用时,我们所能做的就是跨越它。我们如何在源代码级别调试.m代码?
我认为很容易添加一些'print'语句,在matlab中实际上称为'disp',并在VS的输出窗口中观看内容滚动。但我们什么也看不见。甚至不是来自C ++源代码中的printf(),或者直接从命令行而不是VS中运行我们的应用程序。从Google和S.O.,我们了解到发送到stdout的任何内容都不会出现在任何地方。 (这个问题是相关的:Visual Studio 2012 C++ Standard Output但是对我们不起作用。)
我在.m脚本中尝试了msgbox('blah blah'),并重建了DLL。什么都没有出现。我不确定这是否可行,但我们的matlab代码没有执行,或者如果预期msgbox不会在这种情况下工作,比如stdout。
我们对基于打印的调试很满意。断点和其他技术会很好,但目前还不是必需的。
我们在Win7,Visual Studio 2015上使用Matlab R2016b。我们使用.m源来制作DLL,我们有使用DLL的GUI应用程序的源代码。
答案 0 :(得分:1)
有几个项目:
当您调用dll的初始化例程时,请调用
生成' WithHandlers'版本:YourDllInitWithHandlers( **,
**)
。 ' **'是接受matlab disp / warn / error消息的函数的占位符,可以路由到stdout,
可根据需要输出OutputDebugString或log。
您是否可以使用-nojvm
选项从代码初始化mcr?如果是这样,则不会显示消息框。
您无法进入编译库的.m源代码。我们使用的两个选项是:(a)将输入保存到编译的m代码作为mat文件,然后在Matlab闲暇时加载和调试。 (b)在调用编译的dll和调用Matlab-Engine之间切换。此API集允许您启动,控制和调用完全交互式的matlab桌面。您可以像在常规matlab会话中那样设置断点和步进。这需要更多的设置代码,但调试非常方便。