我们如何调试在C ++应用程序中使用的matlab制作的DLL?

时间:2016-12-22 00:52:37

标签: c++ windows debugging matlab-compiler

我们有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应用程序的源代码。

1 个答案:

答案 0 :(得分:1)

有几个项目:

  1. 当您调用dll的初始化例程时,请调用 生成' WithHandlers'版本:YourDllInitWithHandlers( **, **)。 ' **'是接受matlab disp / warn / error消息的函数的占位符,可以路由到stdout, 可根据需要输出OutputDebugString或log。

  2. 您是否可以使用-nojvm选项从代码初始化mcr?如果是这样,则不会显示消息框。

  3. 您无法进入编译库的.m源代码。我们使用的两个选项是:(a)将输入保存到编译的m代码作为mat文件,然后在Matlab闲暇时加载和调试。 (b)在调用编译的dll和调用Matlab-Engine之间切换。此API集允许您启动,控制和调用完全交互式的matlab桌面。您可以像在常规matlab会话中那样设置断点和步进。这需要更多的设置代码,但调试非常方便。