登录论坛

查看完整版本 : 如果naninf->递归限制和崩溃,则matlab dbstop


poster
2019-12-10, 20:48
我在交互式MATLAB控制台中发出以下命令:

>> foo = [1 inf]; >> dbstop if naninf >> foo 我现在的行为很奇怪:MATLAB似乎分成了两个不同的文件,但实际上并没有停止执行。这很慢,因为编辑器会在这两个文件之间反复切换,而Ctrl + C则不执行任何操作。输出为:

481 end 20 if ~isfloat(value) 20 if ~isfloat(value) 399 if numel(var) > numelLimit 20 if ~isfloat(value) 20 if ~isfloat(value) 399 if numel(var) > numelLimit 20 if ~isfloat(value) 20 if ~isfloat(value) 399 if numel(var) > numelLimit ... ... 然后它最终会在调试提示下停止,并带有一个非常长的(递归)堆栈,例如:

dbstack In codetools/private/dataviewerhelper>upconvertIntegralType at 20 In codetools/private/dataviewerhelper at 9 In workspacefunc>createComplexScalar at 271 > In workspacefunc>num2complex at 241 In workspacefunc>getShortValueObjectJ at 230 In workspacefunc>getShortValueObjectsJ at 349 In workspacefunc at 21 In codetools/private/dataviewerhelper>upconvertIntegralType at 20 In codetools/private/dataviewerhelper at 9 In workspacefunc>createComplexScalar at 271 In workspacefunc>num2complex at 241 In workspacefunc>getShortValueObjectJ at 230 In workspacefunc>getShortValueObjectsJ at 349 In workspacefunc at 21 In workspacefunc>getStatObjectsJ at 399 In workspacefunc at 27 In codetools/private/dataviewerhelper>upconvertIntegralType at 20 In codetools/private/dataviewerhelper at 9 In workspacefunc>createComplexScalar at 271 In workspacefunc>num2complex at 241 In workspacefunc>getShortValueObjectJ at 230 In workspacefunc>getShortValueObjectsJ at 349 In workspacefunc at 21 In codetools/private/dataviewerhelper>upconvertIntegralType at 20 In codetools/private/dataviewerhelper at 9 In workspacefunc>createComplexScalar at 271 In workspacefunc>num2complex at 241 In workspacefunc>getShortValueObjectJ at 230 In workspacefunc>getShortValueObjectsJ at 349 In workspacefunc at 21 In workspacefunc>getStatObjectsJ at 399 In workspacefunc at 27 ... ... 在我的真实程序中,我尝试调试时得到的结果仍然相同,甚至更糟,以至于有时我遇到递归限制错误并中止,有时MATLAB完全崩溃。我真的很想能够dbstop if naninf下使用dbstop if naninf ,但是这几乎使它变得不可能,这让我感到难过。有什么建议吗?

在Linux上使用MATLAB 2009b 64位。

谢谢!

编辑:

我刚刚在MATLAB 2007b 32位Linux上尝试过:

>> foo = [1 inf] foo = 1 Inf >> dbstop if naninf >> foo foo = 1 Inf >> foo = [1 inf] foo = 1 Inf >> >> t = foo(2) t = Inf 因此,如果故意将inf分配给变量时naninf似乎没有执行任何操作,请在dbstop处进行操作。 文档说: (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/dbstop.html)

当随后运行的任何MATLAB程序文件由于运算符,函数调用或标量赋值而产生的无限值(Inf)或非数字(NaN)值时,如果naninf则为dbstop或infnan则为dbstop停止执行在调试模式下的MATLAB,在遇到Inf或NaN的行之后立即暂停。

即使在我故意将inf分配给变量时(如上面的t = foo(2)或s = inf)还是“标量分配”是什么意思,这也不应该吗?



回答:

当您尝试在工作区中显示NaN或Inf值时,您看到的那个怪异的深度递归断点看起来像是在Matlab GUI中的断点上,该部分本身是用M代码实现的。 (这是与用户代码一起在Matlab VM中运行的Matlab IDE的缺点之一。)我可以重现。尝试关闭“桌面”菜单中的“工作区”视图,或者使用“桌面”>“桌面布局”>“仅命令窗口”切换到最小布局。

第二部分:对于在命令行直接输入的表达式,不会出现断点。如果将其放入脚本或函数中,则会遇到断点。例如:

function repro_dbstop_naninf foo = Inf; foo = [1 Inf]; bar = foo(2); disp('last line'); 当您调用此函数时,它将在第2行和第4行(实际上)之后中断。

>> dbstop if naninf >> repro_dbstop_naninf NaN/Inf breakpoint hit for repro_dbstop_naninf on line 2. Stopping at next line. 2 foo = Inf; 3 foo = [1 Inf]; K>>

更多&回答... (https://stackoverflow.com/questions/3281871)