Вот дополнение к модулю Terminal - модуль трассировки, позволяющий в определенной контрольной точке вывести в консоль цепь активаций процедур, которая прошла через эту точку.
Пользоваться просто - в начале интересующих процедур пишем вызов - Trace.EntryPoint. Настраивать глубину просмотра активаций можно вызовом Trace.SetDepth. По умолчанию = 3.

## Код:
```
MODULE Trace;

   IMPORT Kernel, T := Terminal, S := SYSTEM, WinApi;
   
   CONST
      FP = 5;
   
   VAR
      depth: INTEGER;

   PROCEDURE EntryPoint* ;
      VAR fp: INTEGER;
            ret: ARRAY 64 OF INTEGER;
            name: ARRAY 64 OF ARRAY 256 OF SHORTCHAR;
            mod: Kernel.Module;
            n, i: INTEGER;
            ref, end: INTEGER;
            s: Kernel.Name;
   BEGIN
      S.GETREG(FP, fp);
      FOR n := 0 TO depth-1 DO
         S.GET(fp+4, ret[n]); S.GET(fp, fp)
      END;
      mod := Kernel.modList;
      n := 0;
      WHILE (mod # NIL) & (n < depth) DO
         FOR i := 0 TO depth-1 DO
            IF( mod.code < ret[i]) & (ret[i] < mod.code + mod.csize) THEN
               name[i] := mod.name$;
               ref := mod.refs;
               REPEAT Kernel.GetRefProc(ref, end, s) UNTIL (end = 0) OR (ret[i]-mod.code < end);
               IF ret[i]-mod.code < end THEN
                  name[i] := name[i] + "." + s
               END;
               INC(n)
            END
         END;
         mod := mod.next
      END;
      T.BeginAtomic;
      T.Int(WinApi.GetCurrentThreadId()); T.String(": ");
      FOR i := 0 TO depth-1 DO
         T.String(name[i]); T.String(" << ")
      END;
      T.Ln;
      T.EndAtomic
   END EntryPoint;
   
   PROCEDURE SetDepth* (d: INTEGER);
   BEGIN
      ASSERT(d < 64, 20);
      depth := d
   END SetDepth;
   
BEGIN
   depth := 3   
END Trace.
```
