【问题标题】:How can we debug our matlab-made DLL used in a C++ app?我们如何调试在 C++ 应用程序中使用的 matlab 制作的 DLL?
【发布时间】:2016-12-22 00:52:37
【问题描述】:

我们有 matlab .m 文件,这些文件已使用 mcc 编译为 DLL。这由我们在 Visual Studio 中调试的 C++ GUI 应用程序使用。当我们调用我们的 matlab 函数时,我们所能做的就是跳过它。我们如何在源代码级别调试 .m 代码?

我认为添加一些“打印”语句会很容易,这些语句在 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。我们有用于制作 DLL 的 .m 源代码,并且我们有使用 DLL 的 GUI 应用程序的源代码。

【问题讨论】:

    标签: c++ windows debugging matlab-compiler


    【解决方案1】:

    几个项目:

    1. 当您调用 dll 的初始化例程时,调用 生成“WithHandlers”版本:YourDllInitWithHandlers( **, **)。 '**' 是接受 matlab 显示/警告/错误消息的函数的占位符,您可以将其路由到标准输出, OutputDebugString 或 log 随意。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多