diff --git a/src/gc.c b/src/gc.c
index 647f7bcebe1f3847f61f29c4eaaef5485e07a0a9..bf0a599ac051b86c198c8fd2a74cc7f4bdfdfeba 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -30,7 +30,7 @@ struct callback *gc_evaluator_callback=0;
 
 #include "block_alloc.h"
 
-RCSID("$Id: gc.c,v 1.172 2001/08/30 23:21:54 mast Exp $");
+RCSID("$Id: gc.c,v 1.173 2001/09/06 16:53:43 mast Exp $");
 
 /* Run garbage collect approximately every time
  * 20 percent of all arrays, objects and programs is
@@ -633,6 +633,8 @@ static void gdb_gc_stop_here(void *a, int weak)
       describe_something(found_in, found_in_type, 2, 0, DESCRIBE_MEM, 0);
     }
   }
+  else
+    fputc('\n', stderr);
   fprintf(stderr,"----------end------------\n");
 }
 
@@ -648,6 +650,19 @@ void debug_gc_xmark_svalues(struct svalue *s, ptrdiff_t num, char *fromwhere)
   found_in=0;
 }
 
+void debug_gc_xmark_svalues2(struct svalue *s, ptrdiff_t num,
+			     int data_type, void *data, char *fromwhere)
+{
+  char *old_found_where = found_where;
+  if (fromwhere) found_where = fromwhere;
+  found_in=data;
+  found_in_type=data_type;
+  gc_xmark_svalues(s,num);
+  found_where=old_found_where;
+  found_in_type=PIKE_T_UNKNOWN;
+  found_in=0;
+}
+
 void debug_gc_check_svalues2(struct svalue *s, ptrdiff_t num,
 			     int data_type, void *data, char *fromwhere)
 {
diff --git a/src/gc.h b/src/gc.h
index 417eaddd2d6d1f55a610c80b0c72c873bdf998a7..e17feda46c9647b74df40cd891c6468a638668f7 100644
--- a/src/gc.h
+++ b/src/gc.h
@@ -1,5 +1,5 @@
 /*
- * $Id: gc.h,v 1.85 2001/08/20 18:08:13 mast Exp $
+ * $Id: gc.h,v 1.86 2001/09/06 16:53:44 mast Exp $
  */
 #ifndef GC_H
 #define GC_H
@@ -204,6 +204,8 @@ void describe_location(void *real_memblock,
 		       int flags);
 void debug_gc_fatal(void *a, int flags, const char *fmt, ...);
 void debug_gc_xmark_svalues(struct svalue *s, ptrdiff_t num, char *fromwhere);
+void debug_gc_xmark_svalues2(struct svalue *s, ptrdiff_t num,
+			     int data_type, void *data, char *fromwhere);
 void debug_gc_check_svalues2(struct svalue *s, ptrdiff_t num,
 			     int data_type, void *data, char *fromwhere);
 void debug_gc_check_weak_svalues2(struct svalue *s, ptrdiff_t num,
@@ -315,7 +317,8 @@ void cleanup_gc(void);
 #define debug_gc_check_weak_svalues2(S,N,T,V,F) gc_check_weak_svalues((S),N)
 #define debug_gc_check_short_svalue2(S,N,T,V,F) gc_check_short_svalue((S),N)
 #define debug_gc_check_weak_short_svalue2(S,N,T,V,F) gc_check_weak_short_svalue((S),N)
-#define debug_gc_xmark_svalues(S,N,X) gc_xmark_svalues((S),N)
+#define debug_gc_xmark_svalues(S,N,F) gc_xmark_svalues((S),N)
+#define debug_gc_xmark_svalues2(S,N,T,V,F) gc_xmark_svalues((S),N)
 #define debug_gc_check2(VP,T,V,F) gc_check((VP))
 #endif
 
@@ -332,10 +335,10 @@ void cleanup_gc(void);
 #define gc_is_referenced(X) !(get_marker(X)->flags & GC_NOT_REFERENCED)
 #endif
 
-#define gc_external_mark2(X,Y,Z) \
-  DMALLOC_TOUCH_MARKER(X, gc_external_mark3( debug_malloc_pass(X),(Y),(Z)))
+#define gc_external_mark2(X,IN,WHERE) \
+  DMALLOC_TOUCH_MARKER(X, gc_external_mark3( debug_malloc_pass(X),(IN),(WHERE)))
 #define gc_external_mark(X) \
-  DMALLOC_TOUCH_MARKER(X, gc_external_mark2( (X)," externally", 0))
+  DMALLOC_TOUCH_MARKER(X, gc_external_mark2( (X), 0, " externally"))
 
 #define add_gc_callback(X,Y,Z) \
   dmalloc_touch(struct callback *,debug_add_gc_callback((X),(Y),(Z)))