diff --git a/dbug/dbug.c b/dbug/dbug.c
index 0c019b5def849da66fed5f7f0b576a9b9774dbaa..07f72a3e7582b6f48adbc5a91c5cb505de91ee0f 100644
--- a/dbug/dbug.c
+++ b/dbug/dbug.c
@@ -256,7 +256,7 @@ static void DBUGCloseFile(CODE_STATE *cs, FILE *fp);
         /* Push current debug settings */
 static void PushState(CODE_STATE *cs);
 	/* Free memory associated with debug state. */
-static void FreeState (struct state *state);
+static void FreeState (CODE_STATE *cs, struct settings *state);
         /* Test for tracing enabled */
 static BOOLEAN DoTrace(CODE_STATE *cs);
 
@@ -744,7 +744,7 @@ void _db_pop_()
   if (discard->next != NULL)
   {
     cs->stack= discard->next;
-    FreeState(discard);
+    FreeState(cs, discard);
   }
 }
 
@@ -1432,7 +1432,8 @@ static void PushState(CODE_STATE *cs)
  *
  */
 static void FreeState (
-struct state *state)
+CODE_STATE *cs,
+struct settings *state)
 {
   if (!is_shared(state, keywords))
     FreeList(state->keywords);
@@ -1469,12 +1470,17 @@ struct state *state)
  */
 void _db_end_ ()
 {
-  reg1 struct state *discard;
-  while((discard= stack) != NULL) {
-    stack= discard -> next_state;
-    FreeState (discard);
+  struct settings *discard;
+  CODE_STATE *cs=0;
+
+  get_code_state_or_return;
+
+  while((discard= cs->stack) != NULL) {
+    if(discard == &init_settings)
+      break;
+    cs->stack= discard->next;
+    FreeState (cs, discard);
   }
-  _db_on_=0;
 }