如何确定内置函数的定义位置?

3
在MATLAB中,定义函数大致有3种方法:非注释的.m文件、.p文件和编译代码(例如DLL、MEX)。
知道函数定义的位置在几种情况下可能会很有帮助,例如当某个我们无法控制的函数出现重大变化时,我们希望尝试回滚到旧版本以期望让我们的代码再次工作;或者在尝试反向工程某些未公开算法时。 which函数通常非常擅长识别函数定义及其位置(对于.m.p和MEX均适用),但在共享库函数方面却不太有用,最多只能指向一个仅包含注释的文档文件。
>> which _mcheck
built-in (undocumented)

>> which svd
built-in (D:\Program Files\MATLAB\R2019a\toolbox\matlab\matfun\svd)

如果是这样的话,假设在我的代码执行期间调用了一个共享库中的函数,那么我该如何找到包含它的特定文件(DLL)呢?
1个回答

6

原来可以使用dbstop实现此功能。例如:

>> which svd
built-in (D:\Program Files\MATLAB\R2019a\toolbox\matlab\matfun\svd)

>> dbstop svd
Warning: Entering debug mode is only supported within running MATLAB code files. 
Warning: MATLAB debugger can only stop in MATLAB code files, and "libmwmathlinalg>svd" is not a MATLAB code file.
         Instead, the debugger will stop at the point right before "libmwmathlinalg>svd" is called.

接下来,只需要找到一个名为libmwmathlinalg的文件(带有相应的扩展名)即可 - 如果您的驱动器已被索引,这不是一个困难的任务。


哈!不确定Mathworks是否有意披露dll,但是很好的发现。 - Ander Biguri
@AnderBiguri 这是有点意料之中的,因为在这些DLL旁边通常会有一个包含所有导出符号和一些附加信息的XML文件。 - Dev-iL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接