Распечатка стека возвратов
By exs. Sunday, 1. July 2007, 09:29:45
точнее определить суть проблемы и текущее состояние потока исполнения.
Т.к. у нас Форт - то нет ничего проще. Прямой доступ к стеку возвратов есть, итого :
: RSEE
CR ." R DUMP : "
RP@ 8 CELLS
OVER + SWAP DO CR I DUP . @ . CELL +LOOP ;
REQUIRE { lib/ext/locals.f
: b RSEE ; : a { | n } 123 -> n b ; 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 (т.к. на стеке возвратов могут лежать не только адреса, но и локальные переменные итп) :
: RSEE
CR ." R DUMP : "
CR
RP@ 8 CELLS
OVER + SWAP DO I STACK-ADDR. DROP CELL +LOOP ;
REQUIRE { lib/ext/locals.f
: b RSEE ; : a { | n } 123 -> n b ; 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: