开发区域

使用MATLAB先进的软件开发

墨西哥人调试。重新定义。

各位,今天我要介绍一位新的客座博主,马丁·阿本。Martijn是我们荷兰办万博1manbetx公室的一名支持工程师,他幻想着MATLAB与外部世界的连接。作为一部分,他作为一个伟大的故事来讲述他是如何与微软的VS Code IDE集成的。把它拿走,马汀!

作为一名MathWorks技术支持工程师,专攻MA万博1manbetxTLAB“外部接口”领域,我经常与MATLAB用户一起工作困难使用自定义编写的mex文件。有时,mex文件不能产生预期的结果,有时它们完全使MATLAB崩溃。之所以会发生这种情况,是因为mex文件是可以在MATLAB中操作本机内存的本机库,即使最小的内存损坏也很容易导致整个应用程序崩溃。虽然我们不能为您调试您的mex文件源代码,但这不是我们提供的支持的一部分,我们可以帮助您自己调试代码的策略。万博1manbetx我们可以提供一些提示和提示,告诉你应该注意哪些问题,我们可以回答关于mxArray和MEX api的问题,我们可以帮助你选择和设置你的调试环境,这就是我想在这篇文章中谈论的。

在Windows上选择调试环境历史上很简单。我们支万博1manbetx持Microsoft Visual C ++编译器创建MEX文件,如果您使用该编译器,Microsoft Visual Studio是调试器的明显选择。事实上,使用此调试器入门是实际内部产品的一部分文档

然而,在MATLAB R2015b中,我们开始支持MinGW64编译器,它利用了万博1manbetx 广东发展银行调试器,并且有各种不同的前端/编辑/ IDE可以使用 广东发展银行.在MATLAB R2015b发布后,我立即写了一篇关于如何使用Eclipse调试的指南,我的同事把它变成了Matlab答案文章.今天在这篇博文中,我们将探讨一个不同的工具,它是我最近最喜欢的免费开发工具之一:Visual Studio Code.(VS代码)。

Visual Studio Code.

当我第一次尝试Visual Studio Code时,它仍然是预览版。它看起来像一个漂亮而圆滑的代码编辑器,但我没有立即意识到添加扩展后它能有多么强大。最近,我在做一个小爱好物联网项目时重新发现了这个工具和它的可扩展性,这让我看到VS Code真的变得多么强大。作为一名MathWorks员工和MATLAB迷,我决定看看是否也可以使用它来调试mex文件。

现在,在我们开始实际的设置和调试之前,首先你需要知道一些关于VS Code的事情。特别是,成熟的Visual Studio的用户可能想知道如何创建一个解决方案并将项目添加到其中,因为这些在VS Code中不存在,至少在这些名称下不存在。来创建类似于项目基本上你打开一个文件夹然后把东西组织在一起文件夹.想要打开您已经开放的其他项目?添加其他文件夹到你的工作区.想要创造类似于a的东西解决方案与多个项目?打开多个文件夹在你的工作区,然后节省这个工作区.打开解决方案然后打开工作空间。

另一件需要注意的重要事情是,VS Code是许多语言的强大代码编辑器,但实际上只是在Node.js中运行的Javascript和Typescript的调试器。对于其他语言和运行时,你需要安装相关的扩展。由于MATLAB的mex文件是用C/ c++编写的,这意味着我们需要一个扩展,该扩展被恰当地命名为“C/ c++”。所以让我们开始实际安装这个扩展。启动VS Code,转到VS Code的Extensions部分:

找到C / C ++扩展:

然后用那个绿色的小东西安装 安装按钮,要完全完成安装请务必点击 重新加载选项后的扩展被下载。

在VS Code中调试mex文件

现在我们有一个可以调试C / C ++代码的VS代码安装,让我们看看我们如何为调试MEX文件的特定任务配置它。我们去 资源管理器,然后使用 文件- > 打开文件夹…重新开始项目.在这里的示例中,我实际上打开了mex文件的源代码所在的文件夹。打开该文件夹后,命名为 工作在我的情况下,打开源代码 mymex.c在编辑器中,VS Code看起来像这样:

我们注意到的第一件事是 #include“mex.h”声明下划线,我们也看到了一些 问题被报道。实际上你不需要解决这些问题 问题为了能够调试你的代码的大部分部分,但你可能想要阅读这些“包括问题”VS代码文档然后创造一个 c_cpp_properties.json可以这样说:

{"configurations": [{"name": "Win32", "includePath": ["c:/ProgramData/MATLAB/Supp万博1manbetxortPackages/R2018a/3P.instrset/mingw_w64. html "]:我nstrset/x86_64-w64-mingw32/include", "c:/MATLAB/R2018a/extern/include", "${workspaceRoot}" ], "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ], "intelliSenseMode": "msvc-x64", "browse": { "path": [ "c:/ProgramData/MATLAB/SupportPackages/R2018a/3P.instrset/mingw_w64.instrset/x86_64-w64-mingw32/include", "c:/MATLAB/R2018a/extern/include", "${workspaceRoot}" ], "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" } } ], "version": 3 }

其中我们告诉VS Code在哪里找到MinGW64头文件以及在哪里找到MATLAB头文件。我的MATLAB R2018a,我在这里工作,安装在 C:\ matlab \ r2018a,更新相应的路径。我的MinGW64支持万博1manbetx包安装在默认位置,所以在大多数情况下,您应该能够重用上面所示的位置。然而,如果你遇到问题,请检查这篇文章末尾的脚注,再次检查这个位置。

使用VS代码现在都很开心,让我们添加一个调试配置。我们去去吧 调试- > 添加配置…并选择 c++ (GDB / LLDB)

这将创建一个新的 启动.JSON.文件,它应该立即显示一个菜单,以添加新的配置。或者你也可以使用 添加配置…按钮。由于它更快/最简单地连接到已经运行的Matlab以进行调试而不是通过调试器启动新的,我们选择添加一个 C / C ++:(GDB) 附加配置:

然后VS Code自动添加一个新的section 启动.JSON.

{"name": "(gdb) Attach", "type": "cppdbg", "request": " Attach", "program": "输入程序名,例如${workspaceRoot}/a.exe", "processId": "${command:pickProcess}", "MIMode": "gdb", "miDebuggerPath": "/path/to/gdb"}

我们需要更新 程序设置为指向MATLAB.exe bin / win64目录的MATLAB安装和 Midebuggerpath.指出 广东发展银行MinGW64支持包中的调试器。万博1manbetx此外, 广东发展银行调试器倾向于停止所有第一个机会SigseGV,因此即使SigseGV将被正确捕获并处理并处理,它也会停止任何抛出的sigsegv。Matlab内的JVM故意抛出这些SigseGV,然后作为其JIT过程的一部分,我们在每次发生这种情况时都不希望在调试器中停止。要告诉调试器忽略我们添加的这些sigsegvs SetupCommands.基本上是 广东发展银行在启动调试器时自动运行的命令。所有这些结合起来就会得到:

{"name": "(gdb) Attach", "type": "cppdbg", "request": " Attach", "program": "c:/MATLAB/R2018a/bin/win64/MATLAB.exe", "processId": "${command:pickProcess}", "MIMode": "gdb", "setupCommands": [{"text": "handle SIGSEGV nostop"}, {"text": "handle SIGSEGV noprint"}], "miDebuggerPath":“c: / ProgramData / MAT万博1manbetxLAB / SupportPackages / R2018a / 3 p.instrset / mingw_w64.instrset / bin / gdb.exe "}

从那里我通常删除 (GDB)发布也默认添加的配置。这应该完成了我们项目的设置,现在我们可以开始实际的调试了。

实际调试

如果你仔细看上面的截图,你会发现我已经编译过了 mymex.c进入 mymex.mexw64.,我有之前准备的在Matlab中:

梅克斯-Gmymex.c

在哪里 -G标记禁用优化,并确保添加了调试所需的符号信息。类似地,您将需要使用 -G国旗。

如此真的,我们现在需要做的就是在代码中的某个地方放置一个断点:

切换到调试视图

确保MATLAB确实在运行我们将VS Code配置为调试器到已经在运行的MATLAB),然后我们点击播放按钮:

这显示了一个对话框运行的进程,我们然后选择MATLAB:

VS Code现在应该附加到MATLAB中,我们应该看到像这样的行

[新线程18404.0 0x473c][新线程18404.0 0x3294]

调试控制台这表明调试器确实在做什么某物并记录关于MATLAB正在做什么的信息。然后切换到MATLAB会话并运行mex -文件:

Mymex ([1 2 PI 21])

当我们这样做时,我们将看到VS Code将在我们的断点上停止,步进(F10)几行,然后我们可以看到:

    1.我们成功地获得了一个指向本机输入数据的指针,并且第一个元素的值为1

    2.输入的大小确实是1x4向量。

我们也可以步进-loop并查看:

    1.怎么样每次迭代更新,这里是 我= 3

    2.数组中的某些元素 调试控制台.屏幕截图显示输入中的第四个元素确实是21,就像我们从MATLAB传入的一样。

要了解您还能做些什么,请阅读调试VS代码的文档

结论

我意识到我们实际上没有调试并在此处在此处调试任何错误,但我确实向您展示了如何使用我最近最近的免费开发工具和最近的免费开发工具的调试MEX文件我希望这已经激励了你给出这个工作流程,试一试,如果你需要调试你的MingW64 MEX文件。幸福的狩猎为那些虫子!

哦,对你的Linux用户来说,虽然上面的故事是关于MinGW64和Windows的,因为VS Code也适用于Linux,你也可以在Linux上应用这个工作流来调试你的GCC mex文件。显然,有些路径会有些不同,但我相信你能弄明白;如果你有任何问题,请告诉我们。

脚注

    在配置VS Code时,我们需要MinGW64 include目录的位置以及 广东发展银行调试器。当MingW64通过支撑件安装时,这些位置可能有点隐藏在您身上;万博1manbetx对于不同的MATLAB版本,确切的位置也可能因不同的支持包版本而变化。万博1manbetx那么你如何确定这些位置?好, gdb.exe通常可以在与gcc/g++(用于编译的实际编译器)相同的目录中找到,如果添加verbose -v.编译代码时标志: mymex -g -v.在详细的输出中,最后几行显示了正在对gcc/g++进行的文字调用。如果您还想找到include目录,您可以从gcc/g++向上找到一个目录,然后进入 x86_64-w64-mingw32在哪里会有一个名为 包括

|

注释

要发表评论,请点击在这里要登录您的MathWorks帐户或创建新的。