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

标签 c++ windows debugging matlab-compiler

我们有使用 mcc 编译成 DLL 的 matlab .m 文件。这由我们在 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 应用程序的源。

最佳答案

几项:

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

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

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

关于c++ - 我们如何调试在 C++ 应用程序中使用的 matlab 制作的 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41274251/

相关文章:

c++ - 如何构建 64 位版本的 Crypto++ dll?

python - 如何使用Python在Django for Windows中激活虚拟环境?

c# - 在 C# 中更改 Windows 的书写语言

c++ - 找不到 Xcode 版本 6.0.1 gmp.h 头文件,即使 gmp.h 和 gmpxx.h 位于 local/include

c++ - 为了使用 Glib::wrap,必须 Glib::init()'ed 什么?

linux - 如何配置 jenkins master slave,其中 master 在 linux 上,slave 在 windows 机器上

c++ - Visual Studio 调试持续未处理的异常

debugging - "output"附近出现错误 : syntax error, 意外输出,预期为 ')'

visual-studio - 任何 ICollection 和 ICollection<T> 类型的调试器可视化工具

c++ - 在没有同步机制的情况下,不同线程同时读取单个 c++ std::map 对象是否安全?