matlab dbstop if naninf -> предел рекурсии и сбой - PullRequest
1 голос
/ 19 июля 2010

Я запускаю следующую команду в интерактивной консоли 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, но это делает это практически невозможным, и это меня огорчает.Любой совет?

Использование 64-разрядной версии MATLAB 2009b в Linux.

Спасибо!

Редактировать:

Я только что попробовал это на 32-битной Linux MATLAB 2007b:

>> foo = [1 inf]
foo =
     1   Inf
>> dbstop if naninf                         
>> foo                                      
foo =                                       
     1   Inf                                
>> foo = [1 inf]                            
foo =                                       
     1   Inf                                
>>      
>> t = foo(2)                                                                          
t =                                                                                    
   Inf 

Так вотdbstop, если naninf, похоже, ничего не делает, когда намеренно присваивает inf переменной. В документах сказано:

dbstop, если naninf или dbstop, если infnan останавливает выполнение, когда любой последующий программный файл MATLAB создает бесконечное значение (Inf) или значение, которое не являетсячисло (NaN) в результате оператора, вызова функции или скалярного присваивания, переводя MATLAB в режим отладки, ставится на паузу сразу после строки, где обнаружен Inf или NaN.

Не должно ли это попастьдаже когда я намеренно назначаю inf переменной (как выше t = foo (2) или s = inf) или что подразумевается под "скалярным присваиванием"?

1 Ответ

4 голосов
/ 19 июля 2010

Эта странная глубоко рекурсивная точка останова, которую вы видите, выглядит так, как будто вы достигаете точек останова в части графического интерфейса Matlab, который сам реализован в M-коде, когда он пытается отобразить значения NaN или Inf в вашей рабочей области. (Это один из недостатков среды Matlab IDE, работающей на виртуальной машине Matlab вместе с кодом пользователя.) Я могу воспроизвести. Попробуйте отключить представление «Рабочая область» в меню «Рабочий стол» или перейти к минимальному макету с помощью «Рабочий стол»> «Макет рабочего стола»> «Только командное окно».

Для второй части: точка останова не будет достигнута для выражений, введенных непосредственно в командной строке. Если вы добавите его в скрипт или функцию, вы достигнете точки останова. Например:

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>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...