Распечатка стека возвратов
By exs. Sunday, July 1, 2007 9:29:45 AM
точнее определить суть проблемы и текущее состояние потока исполнения.
Т.к. у нас Форт - то нет ничего проще. Прямой доступ к стеку возвратов есть, итого :
<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
Это уже может пригодится на практике.







How to use Quote function: