开发人员区

高级软件开发与MATLAB

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

伙计,今天我想介绍一位新的博客·马丁雅·阿根。Martijn是一名支持工万博1manbetx程师,我们的荷兰办事处是关于Matlab与外部世界的联系的白日梦。作为他作为一个伟大故事的一部分,可以讲述如何与微软的鼓掌的VS代码IDE集成。把它带走martijn!

作为MathWorks技术支持工程师专门从事Mat万博1manbetxlab“外部接口”区域,我经常与Matlab用户一起工作困难使用他们的自定义写入MEX文件。有时MEX文件不会产生预期的结果,有时它们会完全崩溃MATLAB。这可能发生,因为mex-files是本机库,它可以操纵matlab内的本地内存,甚至最小的内存损坏很容易导致整个应用程序崩溃。虽然我们无法为您调试MEX-File源代码,但这不是我们提供的支持的一部分,我们可以帮助您自己调试代码的策略。万博1manbetxWe can provide some hints and tips on what kind of issues to look out for, we can answer questions on the mxArray- and MEX APIs, and we can help you choose and setup your debug environment, which is what I’d like to talk about in this post.

从历史上看,在Windows上选择调试环境非常简单。我们支万博1manbetx持Microsoft Visual c++编译器来创建mex文件,如果您使用该编译器,那么Microsoft Visual Studio是调试器的最佳选择。事实上,开始使用这个调试器是实际产品的一部分文件

但是,在Matlab R2015B中,我们开始支持MingW64编译器,它利用了万博1manbetx GDB.调试器,还有各种不同的前端/编辑器/ ide可以使用 GDB..在Matlab R2015B发布后立即编写了一个关于如何使用Eclipse进行调试的指南,我的同事变成了MATLAB回答文章.今天在这个博客文章中,我们正在研究一个不同的工具,这是我最近最喜欢的免费开发工具之一:Visual Studio代码(VS代码)。

Visual Studio代码

当我第一次尝试Visual Studio代码时,它仍然是预览构建。它看起来像一个很好和光滑的代码编辑器,但我没有立即识别添加扩展时可能有多强大。我最近重新发现了该工具及其可扩展性,在做一点爱好者的IOT项目时,它显示了我的VS代码真正变成了强大的功能。作为MathWorks员工和整体Matlab粉丝,我决定看到我是否可以使用它来调试MEX文件。

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

另一件重要的是要注意的是,开箱即用的VS代码是许多语言的强大代码编辑器,但实际上只有用于在Node.js中运行的JavaScript和CypeScript的调试器。对于其他语言和运行时,您需要安装相关的扩展名。由于MATLAB MEX文件以C / C ++编写,因此我们需要一个扩展名,并且该扩展名为“C / C ++”。因此,让我们开始努力安装此扩展名。触发VS代码并将其返回到vs代码中的Extensions部分:

找到C/ c++扩展:

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

MEX文件调试在VS代码中

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

我们首先注意到的是 # include“mex.h”语句被强调,我们也看到了一些 问题被报道。你实际上并没有解决这些问题 问题为了能够调试代码的大多数部分,但您可能希望在这些“包括问题”中读取VS代码文档然后创建一个 c_cpp_properties.json.有类似的东西:

{“configurations”:[{“名称”:“Win32”,“IncludePath”:[C:/pramgataData/matlab/supportpac万博1manbetxkages/r2018a/3p.instret/mingw_w64.instret/x86_64-w64- mimentw32/include“,”c:/ matlab / r2018a / extern / internall“,”$ {workspaceroot}“],”定义“:[”_debug“,”Unicode“,”_unicode“,”IntellIsenseMode“:”MSVC-X64“,”浏览“:{”path“:[”C:/prographyata/matlab/sup万博1manbetxportpackages/r2018a/3p.instret/mingw_w64.instret/x86_64-w64- mimentw32/include“,c:/ matlab / r2018a / extern / compress”,“$ {workspaceroot}”],“limitsymbolstoincludedheaders”:true,“databasefilename”:“”}}“,”版本“:3}

在其中,我们告诉VS代码在哪里找到MingW64标题以及在哪里找到MATLAB标题。我在这里使用的Matlab R2018A,安装在 c: \ MATLAB \ R2018a,相应地更新您的路径。我的Mingw64支持万博1manbetx包安装在默认位置,因此在大多数情况下,您应该能够重新使用上面所示的位置。但是,如果您遇到问题,请在此帖子末尾检查脚注以仔细检查此位置。

现在VS Code都很好了,让我们添加一个调试配置。我们去 调试-> 添加配置...并选择 C ++(GDB / LLDB)

这将创造一个新的 launch.json我们的文件,它应该立即显示一个菜单来添加新配置。或者,您可以使用 添加配置...按钮。由于连接到已经运行的MATLAB进行调试比通过调试器启动一个新的MATLAB更快/最容易,所以我们选择添加一个 C / c++ (gdb): 附加配置:

VS代码然后自动添加新部分 launch.json

{“名称”:“(gdb)附加”,“类型”:“cppdbg”,“请求”:“附加”,“程序”:“输入程序名称,例如$ {workspaceroot} /a.exe”,“,”processId“:”$ {命令:pickprocess}“,”mimode“:”gdb“,”midebuggerpath“:”/ path / to / gdb“}

我们需要更新 程序设置为指向MATLAB.exe bin / win64我们的MATLAB安装目录和 miDebuggerPath指向 GDB.调试器来自MingW64支持包。万博1manbetx此外, GDB.debugger倾向于在所有第一次SIGSEGV上停止,所以它实际上在任何抛出的SIGSEGV上停止,即使那个SIGSEGV将被正确捕获和处理。MATLAB中的JVM故意抛出这些sigsegv,然后捕获这些作为其JIT进程的一部分,我们不希望每次发生这种情况时都在调试器中停止。为了告诉调试器忽略这些sigsegv,我们添加了 setupCommands本质上是 GDB.启动调试器时自动运行的命令。所有这些组合然后给出:

{“名称”:“(gdb)附加”,“类型”:“cppdbg”,“请求”:“附加”,“程序”:“c:/matlab/r2018a/bin/win64/matlab.exe”,“processId“:”$ {命令:pickprocess}“,”mimode“:”gdb“,”setupmommands“:[{”text“:”hander sigsegv n ostop“},{”text“:”hander sigsegv noprint“}”,“midebuggerpath”:“c:/programdata/matlab/s万博1manbetxupportpackages/r2018a/3p.instret/mingw_w64.instret/bin/gdb.exe”}

从那里,我通常删除 (GDB)发布默认情况下添加的配置也是如此。应该完成我们项目的设置,现在我们可以达到实际调试。

实际调试

如果您在上面的屏幕截图中支付了封闭的注意,您可以看到我已经编制了 mymex.c. mymex.mexw64我有早先准备好在MATLAB:

墨西哥人- gmymex.c.

在那里 - g标志已禁用优化,并确保添加了我们需要调试的符号信息。您同样需要使用此调试信息构建MEX文件 - g旗帜。

所以我们现在需要做的就是在代码中放置一个断点:

切换到调试视图

确保matlab实际上正在运行(我们将VS代码配置为附加毕竟已经运行的matlab调试器,然后我们然后点击播放按钮:

它显示了一个具有运行进程的对话框,我们然后选择matlab:

vs代码现在应该附加到matlab,我们应该看到一些类似的线

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

在里面 调试控制台这向我们展示了调试器肯定在做某物并正在记录关于MATLAB正在做的信息。然后,我们可以切换到我们的MATLAB会话并运行MEX文件:

mymex([1 2 pi 21])

当我们这样做时,我们将看到VS代码将停止在我们的断点上,踩踏(F10)我们可以看到几行:

    1.我们能够成功获取指向本机输入数据的指针,第一个元素有值1

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

我们也可以逐步 为了循环,看看:

    1.如何 一世每次迭代更新,我们在这里 我= 3.

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

想知道你还能做什么,请阅读VS Code的调试文档

结论

我意识到我们没有实际调试和修复任何错误在任何超级先进的现实世界的今天mex files,但是我向您展示如何开始调试mex files使用我recent-favorite免费开发工具和我希望这激发了你尝试这个工作流如果你需要调试你的MinGW64 mex files。祝你找到那些虫子愉快!

哦,对于你的Linux用户出来,虽然上面的故事是关于Mingw64和Windows,因为VS代码也适用于Linux,但您也可以在Linux上应用此工作流程来调试您的GCC MEX文件。显然,一些路径会有所不同,但我相信你能弄清楚;如果您对此有任何其他问题,请告诉我们。

脚注

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

|

评论

要留下评论,请点击这里登录到您的MathWorks帐户或创建一个新帐户。