墨西哥人调试。重新定义。
各位,今天我要介绍一位新的客座博主,马丁·阿本。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
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文件的特定任务配置它。我们去
我们注意到的第一件事是
{"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,我在这里工作,安装在
使用VS代码现在都很开心,让我们添加一个调试配置。我们去去吧
这将创建一个新的
然后VS Code自动添加一个新的section
{"name": "(gdb) Attach", "type": "cppdbg", "request": " Attach", "program": "输入程序名,例如${workspaceRoot}/a.exe", "processId": "${command:pickProcess}", "MIMode": "gdb", "miDebuggerPath": "/path/to/gdb"}
我们需要更新
{"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 "}
从那里我通常删除
实际调试
如果你仔细看上面的截图,你会发现我已经编译过了
梅克斯-Gmymex.c
在哪里
如此真的,我们现在需要做的就是在代码中的某个地方放置一个断点:
切换到调试视图
确保MATLAB确实在运行我们将VS Code配置为附调试器到已经在运行的MATLAB),然后我们点击播放按钮:
这显示了一个对话框运行的进程,我们然后选择MATLAB:
VS Code现在应该附加到MATLAB中,我们应该看到像这样的行
[新线程18404.0 0x473c][新线程18404.0 0x3294]
在
Mymex ([1 2 PI 21])
当我们这样做时,我们将看到VS Code将在我们的断点上停止,步进(F10)几行,然后我们可以看到:
1.我们成功地获得了一个指向本机输入数据的指针,并且第一个元素的值为1
2.输入的大小确实是1x4向量。
我们也可以步进
1.怎么样
2.数组中的某些元素
要了解您还能做些什么,请阅读调试VS代码的文档.
结论
我意识到我们实际上没有调试并在此处在此处调试任何错误,但我确实向您展示了如何使用我最近最近的免费开发工具和最近的免费开发工具的调试MEX文件我希望这已经激励了你给出这个工作流程,试一试,如果你需要调试你的MingW64 MEX文件。幸福的狩猎为那些虫子!
哦,对你的Linux用户来说,虽然上面的故事是关于MinGW64和Windows的,因为VS Code也适用于Linux,你也可以在Linux上应用这个工作流来调试你的GCC mex文件。显然,有些路径会有些不同,但我相信你能弄明白;如果你有任何问题,请告诉我们。
脚注
在配置VS Code时,我们需要MinGW64 include目录的位置以及
注释
要发表评论,请点击在这里要登录您的MathWorks帐户或创建新的。