开发区域

MATLAB高级软件开发

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

各位,今天我要介绍一位新的客座博主Martijn Aben。Martijn是我们荷兰办金宝app公室的一名支持工程师,他幻想着MATLAB与外部世界的连接。作为其中的一部分,他讲述了一个伟大的故事,关于他如何与微软称赞的VS Code IDE集成。把它拿走,马丁!

作为MathWorks技术支持工程师,我专门从事M金宝appATLAB“外部接口”领域的工作,我经常与MATLAB用户一起工作困难用他们自定义编写的墨西哥文件。有时mex文件不能产生预期的结果,有时它们会完全崩溃MATLAB。这是因为墨西哥文件是本地库,可以操纵MATLAB内部的本机内存,即使是最小的内存损坏也很容易导致整个应用程序崩溃。虽然我们不能为您调试您的mexfile源代码,但这不是我们提供的支持的一部分,我们可以帮助您使用策略来自己调试您的代码。金宝app我们可以提供一些关于需要注意的问题的提示和技巧,我们可以回答关于mxArray-和MEX api的问题,我们可以帮助您选择和设置调试环境,这就是我想在这篇文章中讨论的内容。

在Windows上选择调试环境一直非常简单。我们支金宝app持Microsoft Visual c++编译器来创建墨西哥文件,如果您使用该编译器,那么Microsoft Visual Studio显然是调试器的首选。事实上,开始使用这个调试器是实际产品的一部分文档

然而,在MATLAB R2015b中,我们开始支持MinGW64编译器,它利用金宝app 广东发展银行调试器,还有各种不同的前端/编辑器/ ide可以使用 广东发展银行.在MATLAB R2015b发布后,我立即编写了一份如何使用Eclipse进行调试的指南,我的同事将其变成了一份MATLAB答题文章.今天在这篇博文中,我们将介绍一个不同的工具,这是我最近最喜欢的免费开发工具之一:Visual Studio代码(VS代码)。

Visual Studio代码

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

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

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

查找C/ c++扩展:

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

在VS Code中的墨西哥文件调试

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

我们首先注意到的是 # include“mex.h”声明被划了线,我们也看到一些 问题被报道。实际上你不需要解决这些问题 问题为了能够调试代码的大部分,但您可能需要阅读这些“包含问题”在VS代码文档然后创建一个 c_cpp_properties.json比如:

{"configurations": [{"name": "Win32", "includePath": ["c:/ProgramData/MATLAB/Supp金宝apportPackages/R2018a/3 .instrset/mingw_w64.]我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支持金宝app包安装在默认位置,因此在大多数情况下,您应该能够重用上面显示的位置。然而,为了防止你遇到问题,检查这篇文章末尾的脚注,再次检查这个位置。

有了vscode,现在让我们添加一个调试配置。我们去 调试-> 添加配置…并选择 c++ (GDB / LLDB)

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

然后vscode自动添加一个新节到 launch.json

{"name": "(gdb) Attach", "type": "cppdbg", "request": " Attach", "program": "enter program name, for example ${workspaceRoot}/a.exe", "processId": "${command:pickProcess}", "MIMode": "gdb", "miDebuggerPath": "/path/to/gdb"}

我们需要更新 程序设置为指向MATLAB.exe bin / win64我们的MATLAB安装和目录 miDebuggerPath指向 广东发展银行MinGW64支持包中的调试器。金宝app此外, 广东发展银行调试器倾向于在所有第一次出现SIGSEGV时停止,因此它实际上在任何抛出的SIGSEGV时停止,即使该SIGSEGV将被捕获并正确处理。MATLAB内部的JVM故意抛出这些sigsegv,然后作为JIT进程的一部分捕获它们,我们不希望每次发生这种情况时都在调试器中停止。告诉调试器忽略我们添加的这些sigsegv 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/MATLAB/Suppor金宝apptPackages/R2018a/3 .instrset/mingw_w64.instrset/bin/gdb.exe"}

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

实际调试

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

墨西哥人- gmymex.c

在哪里 - g标记禁用优化,并确保添加了我们需要调试的符号信息。方法构建带有此调试信息的mex文件 - 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的向量。

我们也可以通过我们的-循环并查看:

    1.如何每次迭代都会更新,现在我们在这里 I = 3

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

要了解您还可以做什么,请阅读VS Code的调试文档

结论

我意识到我们今天并没有在任何超级高级的实际mex -file中调试和修复任何错误,但我确实向您展示了如何使用我最近最喜欢的免费开发工具之一开始调试mex -file,我希望这能激励您在需要调试MinGW64 mex -file时尝试一下这个工作流。愉快地寻找那些虫子!

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

脚注

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

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。