Matlab 我可以在不产生子进程的情况下调试进程吗?

Matlab 我可以在不产生子进程的情况下调试进程吗?,matlab,debugging,gdb,hardware,Matlab,Debugging,Gdb,Hardware,我已经用C/C++为MATLAB编写了一个共享库,为单色相机创建了一个API 代码可以工作,但我在内存管理方面有一些奇怪的问题(基本上,用于释放/动态分配的MATLAB函数不太可靠)。此外,我还想调试其他一些非常低级的东西,比如查看保存原始摄影机缓冲区的寄存器的值 我可以编写独立的C代码并使用GDB启动它,但是子进程会使软件崩溃,因为一次只允许1个线程打开与摄像头的连接。如果我不在与设备交互的代码中设置断点,一切都很好。但是我想停止程序,比如在获取图像缓冲区之后,但在将数据复制到MATLAB输出

我已经用C/C++为MATLAB编写了一个共享库,为单色相机创建了一个API

代码可以工作,但我在内存管理方面有一些奇怪的问题(基本上,用于释放/动态分配的MATLAB函数不太可靠)。此外,我还想调试其他一些非常低级的东西,比如查看保存原始摄影机缓冲区的寄存器的值

我可以编写独立的C代码并使用GDB启动它,但是子进程会使软件崩溃,因为一次只允许1个线程打开与摄像头的连接。如果我不在与设备交互的代码中设置断点,一切都很好。但是我想停止程序,比如在获取图像缓冲区之后,但在将数据复制到MATLAB输出之前,调试器生成的子进程会导致所有内容都被锁定

有人知道我该怎么解决这个问题吗

编辑:“不可靠”不是一个好的措辞。基本上,我从相机中检索图像缓冲区(这是动态分配的,因为图像位深度是可变的)。这个数组是用mxMalloc和mxDestroyArray创建/销毁的,如果我启用了
MATLAB\u MEM\u MGR
,它可以正常工作。这是我想在MEX内部调试的部分内容。另一个是在返回matlab之前比较图像缓冲区的原始字节值

补充澄清:
我在GDB中得到的错误实际上是使用中的
资源的GenICam错误。我的直觉是,因为父进程没有释放相机资源,启动的子线程实际上会导致问题。在Windows上,对于MEX来说,从VC++切换到MinGW-w64似乎有点危险,因为您很容易会遇到经典的Windows错误,即具有多个libc副本。请参阅警告“不要链接到使用非MinGW编译器编译的库文件”。使用“gcc”构建的MEX将从msvcrt.dll中拉入malloc()和free(),而您链接的任何使用“cl”构建的dll将改为拉入ucrtbase.dll。这很容易导致崩溃,例如,如果gcc编译代码在cl编译代码中使用malloc()对分配的块调用free()

MATLAB安装的gdb.exe看起来确实有点奇怪,特别是当我按下Control-C时。它也不喜欢Cygwin终端。它确实产生了一个奇怪的“gdborig”助手进程。最后,我一直看到一个微软的a/V工具mpcmdrun,在我玩它的时候突然启动了。您可以尝试由安装的较新的gdb(尽管我可能也在那里看到了A/V)


实际上,一些随机子进程可能继承了设备连接句柄,从而导致锁定。但这个子过程可能是另外一回事。。。这不是gdb(7.11.1)愚蠢的旧版本所创建的额外版本。

这个答案可能会有所帮助:“用于释放/动态分配的MATLAB函数不太可靠”-我怀疑它们不可靠,相反,它们是完全一致的。你可能误解了它们工作原理的一些细节。哪些阵列是自动清除的,哪些阵列不是自动清除的,并不总是清楚地记录在案。您在哪个平台上?我以前从未编写过MEX,但如果您仍然在Windows上使用“cl”,那么我想我正好为您准备了该产品。这是一个C/C++内存调试器。正如Cris所指出的,malloc()或类似的东西不太可能是不可靠的。很抱歉刚才看到了这些。我在窗户上。使用mxMalloc和mxDestroyArray两周内工作正常,突然相同的代码开始导致访问冲突。我启用了MEM_MGR,问题就消失了?哦,这很有趣!我正在使用cl进行构建,复制的libc副本听起来非常可能。意外ret2libc lol?我甚至不知道这是一件事!我在一个商业C/C++调试工具上工作。。。我们已经多次看到了多重libc。这很容易意外地完成--/MT(d)vs/MD(d),等等,尽管MATLAB MEX调试对我来说是新的。昨天我玩了一整天。Win32进程中{m,re}alloc/free()的副本数没有限制。MATLAB甚至有自己的ucrtbase.dll副本。通过扩展,您可以拥有的堆的数量没有限制。像HeapAlloc()这样的Win32 API甚至将“heap”作为显式参数。与Unix/Linux相比,Unix/Linux通常只有一个堆。我会用GCC重建一切,