Хотя вопрос, где ошибка, открыт. Поскольку логика, заложенная Ominc в Kernel.PushTrapCleaner и Kernel.PopTrapCleaner не известна.

PushTrapCleaner не даёт повторно регистрировать обработчик.## Код:
```
PROCEDURE PushTrapCleaner* (c: TrapCleaner);
      VAR t: TrapCleaner;
   BEGIN
      t := trapStack; WHILE (t # NIL) & (t # c) DO t := t.next END;
      ASSERT(t = NIL, 20);
      c.next := trapStack; trapStack := c
   END PushTrapCleaner;
```

PopTrapCleaner выталкивае все до данного (тут логика есть). Но если данный в стэке не присутствует, выкидывается всё. Это приводит к означенной в теме проблеме.
## Код:
```
PROCEDURE PopTrapCleaner* (c: TrapCleaner);
      VAR t: TrapCleaner;
   BEGIN
      t := NIL;
      WHILE (trapStack # NIL) & (t # c) DO
         t := trapStack; trapStack := trapStack.next
      END
   END PopTrapCleaner;
```
Либо c IN trapStack нужно сделать предусловием, чтобы обеспечить отлов несбалансированных вызовов Push.../Pop... Либо нужно игнорировать такой вызов и ничего не выталкивать вообще. Третий вариант --- трудноуловимая логическая ошибка, пример которой в этой теме.