проФорт

Форт и всё такое

Распечатка стека возвратов

, ,

Иногда при отладке очень хочется посмотреть содержимое стека возвратов, чтобы
точнее определить суть проблемы и текущее состояние потока исполнения.

Т.к. у нас Форт - то нет ничего проще. Прямой доступ к стеку возвратов есть, итого :
<span style='color:#000084; font-weight:bold; '>: </span><span style='color:#000084; font-weight:bold; '>RSEE</span>
   <span style='color:#000084; font-weight:bold; '>CR </span><span style='color:#000084; font-weight:bold; '>." </span><span style='color:#0000ff; '>R DUMP : </span><span style='color:#000084; font-weight:bold; '>"</span>
   <span style='color:#000084; font-weight:bold; '>RP@ </span><span style='color:#008c00; '>8 </span><span style='color:#000084; font-weight:bold; '>CELLS</span>
   <span style='color:#000084; font-weight:bold; '>OVER </span><span style='color:#000084; font-weight:bold; '>+ </span><span style='color:#000084; font-weight:bold; '>SWAP </span><span style='color:#800000; '>DO </span><span style='color:#000084; font-weight:bold; '>CR </span><span style='color:#800000; '>I </span><span style='color:#000084; font-weight:bold; '>DUP </span><span style='color:#000084; font-weight:bold; '>. </span><span style='color:#000084; font-weight:bold; '>@ </span><span style='color:#000084; font-weight:bold; '>. </span><span style='color:#000084; font-weight:bold; '>CELL </span><span style='color:#800000; '>+LOOP</span><span style='color:#000084; font-weight:bold; '> ;</span>

<span style='color:#000084; font-weight:bold; '>REQUIRE </span><span style='color:#000084; font-weight:bold; '>{ </span><span style='color:#000084; '>lib/ext/locals.f</span>
<span style='color:#000084; font-weight:bold; '>: </span><span style='color:#000084; font-weight:bold; '>b</span> RSEE<span style='color:#000084; font-weight:bold; '> ;</span>  <span style='color:#000084; font-weight:bold; '>: </span><span style='color:#000084; font-weight:bold; '>a </span><span style='color:#000084; font-weight:bold; '>{ </span><span style='color:#000084; font-weight:bold; '>|</span><span style='color:#008c00; '> n</span><span style='color:#000084; font-weight:bold; '> } </span><span style='color:#008c00; '>123 </span><span style='color:#000084; font-weight:bold; '>-></span> n b<span style='color:#000084; font-weight:bold; '> ;</span>  a



Вывод :
R DUMP :
1240864 5678517
1240868 5678583
1240872 5583352
1240876 4
1240880 123
1240884 5659375
1240888 5659510
1240892 5661240


Не очень информативно, правда? Но ведь можно взять эти адреса и поискать рядом с ними словарную статью из которой взять имя слова телу которого принадлежит этот адрес! Эта функциональность уже присутствует в ядре SPF, вспомните дамп отчёта исключений. Слово которое нас интересует это WordByAddr ( addr -- a u ) и обёртка над ним для предотвращения исключений по Access Violation (т.к. на стеке возвратов могут лежать не только адреса, но и локальные переменные итп) :
<span style='color:#000084; font-weight:bold; '>: </span><span style='color:#000084; font-weight:bold; '>RSEE</span>
   <span style='color:#000084; font-weight:bold; '>CR </span><span style='color:#000084; font-weight:bold; '>." </span><span style='color:#0000ff; '>R DUMP : </span><span style='color:#000084; font-weight:bold; '>"</span>
   <span style='color:#000084; font-weight:bold; '>CR</span>
   <span style='color:#000084; font-weight:bold; '>RP@ </span><span style='color:#008c00; '>8 </span><span style='color:#000084; font-weight:bold; '>CELLS</span>
   <span style='color:#000084; font-weight:bold; '>OVER </span><span style='color:#000084; font-weight:bold; '>+ </span><span style='color:#000084; font-weight:bold; '>SWAP </span><span style='color:#800000; '>DO </span><span style='color:#800000; '>I</span> STACK-ADDR. <span style='color:#000084; font-weight:bold; '>DROP </span><span style='color:#000084; font-weight:bold; '>CELL </span><span style='color:#800000; '>+LOOP</span><span style='color:#000084; font-weight:bold; '> ;</span>

<span style='color:#000084; font-weight:bold; '>REQUIRE </span><span style='color:#000084; font-weight:bold; '>{ </span><span style='color:#000084; '>lib/ext/locals.f</span>
<span style='color:#000084; font-weight:bold; '>: </span><span style='color:#000084; font-weight:bold; '>b</span> RSEE<span style='color:#000084; font-weight:bold; '> ;</span>  <span style='color:#000084; font-weight:bold; '>: </span><span style='color:#000084; font-weight:bold; '>a </span><span style='color:#000084; font-weight:bold; '>{ </span><span style='color:#000084; font-weight:bold; '>|</span><span style='color:#008c00; '> n</span><span style='color:#000084; font-weight:bold; '> } </span><span style='color:#008c00; '>123 </span><span style='color:#000084; font-weight:bold; '>-></span> n b<span style='color:#000084; font-weight:bold; '> ;</span>  a



Получаем :
R DUMP :
1240864 :  5678485 b
1240868 :  5678551 a
1240872 :  5583352 (LocalsExit)
1240876 :  4 <not found>
1240880 :  123 <not found>
1240884 :  5659375 INTERPRET_
1240888 :  5659510 INTERPRET
1240892 :  5661240 TranslateFlow


Это уже может пригодится на практике.

Python Challenge 6-10Конечные автоматы и таблицы решений на SPF

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies