apply patch #101362 by Vladimir Marangozov
also initial static debug variable to 0
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 8e495e6..57ee7b9 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -57,7 +57,7 @@
 				DEBUG_UNCOLLECTABLE | \
 				DEBUG_INSTANCES | \
 				DEBUG_OBJECTS
-static int debug;
+static int debug = 0;
 
 /* list of uncollectable objects */
 static PyObject *garbage;
@@ -222,9 +222,11 @@
 {
 	PyGC_Head *next;
 	PyGC_Head *gc = unreachable->gc_next;
-	static PyObject *delstr;
+	static PyObject *delstr = NULL;
 	if (delstr == NULL) {
 		delstr = PyString_InternFromString("__del__");
+		if (delstr == NULL)
+			Py_FatalError("PyGC: can't initialize __del__ string");
 	}
 	for (; gc != unreachable; gc=next) {
 		PyObject *op = PyObject_FROM_GC(gc);
@@ -268,9 +270,8 @@
 }
 
 static void
-debug_instance(PyObject *output, char *msg, PyInstanceObject *inst)
+debug_instance(char *msg, PyInstanceObject *inst)
 {
-	char buf[200];
 	char *cname;
 	/* be careful not to create new dictionaries */
 	PyObject *classname = inst->in_class->cl_name;
@@ -278,20 +279,18 @@
 		cname = PyString_AsString(classname);
 	else
 		cname = "?";
-	sprintf(buf, "gc: %s<%.100s instance at %p>\n", msg, cname, inst);
-	PyFile_WriteString(buf, output);
+	PySys_WriteStderr("gc: %.100s <%.100s instance at %p>\n",
+			  msg, cname, inst);
 }
 
 static void
-debug_cycle(PyObject *output, char *msg, PyObject *op)
+debug_cycle(char *msg, PyObject *op)
 {
 	if ((debug & DEBUG_INSTANCES) && PyInstance_Check(op)) {
-		debug_instance(output, msg, (PyInstanceObject *)op);
+		debug_instance(msg, (PyInstanceObject *)op);
 	} else if (debug & DEBUG_OBJECTS) {
-		char buf[200];
-		sprintf(buf, "gc: %s<%.100s %p>\n", msg,
-			op->ob_type->tp_name, op);
-		PyFile_WriteString(buf, output);
+		PySys_WriteStderr("gc: %.100s <%.100s %p>\n",
+				  msg, op->ob_type->tp_name, op);
 	}
 }
 
@@ -357,20 +356,15 @@
 	PyGC_Head unreachable;
 	PyGC_Head finalizers;
 	PyGC_Head *gc;
-	PyObject *output = NULL;
 
-	if (debug) {
-		output = PySys_GetObject("stderr");
-	}
 	if (debug & DEBUG_STATS) {
-		char buf[100];
-		sprintf(buf, "gc: collecting generation %d...\n", generation);
-		PyFile_WriteString(buf,output);
-		sprintf(buf, "gc: objects in each generation: %ld %ld %ld\n",
+		PySys_WriteStderr(
+			"gc: collecting generation %d...\n"
+			"gc: objects in each generation: %ld %ld %ld\n",
+			generation,
 			gc_list_size(&generation0),
 			gc_list_size(&generation1),
 			gc_list_size(&generation2));
-		PyFile_WriteString(buf,output);
 	}
 
 	/* Using ob_refcnt and gc_refs, calculate which objects in the
@@ -408,8 +402,8 @@
 	for (gc = unreachable.gc_next; gc != &unreachable;
 			gc = gc->gc_next) {
 		m++;
-		if (output != NULL && (debug & DEBUG_COLLECTABLE)) {
-			debug_cycle(output, "collectable ", PyObject_FROM_GC(gc));
+		if (debug & DEBUG_COLLECTABLE) {
+			debug_cycle("collectable", PyObject_FROM_GC(gc));
 		}
 	}
 	/* call tp_clear on objects in the collectable set.  This will cause
@@ -422,19 +416,17 @@
 	for (gc = finalizers.gc_next; gc != &finalizers;
 			gc = gc->gc_next) {
 		n++;
-		if (output != NULL && (debug & DEBUG_UNCOLLECTABLE)) {
-			debug_cycle(output, "uncollectable ", PyObject_FROM_GC(gc));
+		if (debug & DEBUG_UNCOLLECTABLE) {
+			debug_cycle("uncollectable", PyObject_FROM_GC(gc));
 		}
 	}
-	if (output != NULL && (debug & DEBUG_STATS)) {
+	if (debug & DEBUG_STATS) {
 		if (m == 0 && n == 0) {
-			PyFile_WriteString("gc: done.\n", output);
+			PySys_WriteStderr("gc: done.\n");
 		} else {
-			char buf[200];
-			sprintf(buf,
-				"gc: done, %ld unreachable, %ld uncollectable.\n",
-				n+m, n);
-			PyFile_WriteString(buf, output);
+			PySys_WriteStderr(
+			    "gc: done, %ld unreachable, %ld uncollectable.\n",
+			    n+m, n);
 		}
 	}
 
@@ -444,7 +436,6 @@
 	handle_finalizers(&finalizers, old);
 
 	allocated = 0;
-	PyErr_Clear(); /* in case writing to sys.stderr failed */
 	return n+m;
 }