Make DEBUG_printf() a proper function, implementation is port-dependent.

In particular, unix outputs to stderr, to allow to run testsuite against
micropython built with debug output (by redirecting stderr to /dev/null).
diff --git a/py/gc.c b/py/gc.c
index e66a683..8c4bc69 100644
--- a/py/gc.c
+++ b/py/gc.c
@@ -10,7 +10,7 @@
 
 #if 0 // print debugging info
 #define DEBUG_PRINT (1)
-#define DEBUG_printf(args...) printf(args)
+#define DEBUG_printf DEBUG_printf
 #else // don't print debugging info
 #define DEBUG_printf(args...) (void)0
 #endif
diff --git a/py/malloc.c b/py/malloc.c
index 5699d86..41cf1fd 100644
--- a/py/malloc.c
+++ b/py/malloc.c
@@ -6,7 +6,7 @@
 #include "mpconfig.h"
 
 #if 0 // print debugging info
-#define DEBUG_printf(args...) printf(args)
+#define DEBUG_printf DEBUG_printf
 #else // don't print debugging info
 #define DEBUG_printf(args...) (void)0
 #endif
diff --git a/py/misc.h b/py/misc.h
index 065b070..989650c 100644
--- a/py/misc.h
+++ b/py/misc.h
@@ -117,4 +117,7 @@
 void vstr_vprintf(vstr_t *vstr, const char *fmt, va_list ap);
 #endif
 
+// Debugging helpers
+int DEBUG_printf(const char *fmt, ...);
+
 #endif // _INCLUDED_MINILIB_H
diff --git a/py/qstr.c b/py/qstr.c
index e4f0223..a34479c 100644
--- a/py/qstr.c
+++ b/py/qstr.c
@@ -10,8 +10,7 @@
 // also probably need to include the length in the string data, to allow null bytes in the string
 
 #if 0 // print debugging info
-#include <stdio.h>
-#define DEBUG_printf(args...) printf(args)
+#define DEBUG_printf DEBUG_printf
 #else // don't print debugging info
 #define DEBUG_printf(args...) (void)0
 #endif
diff --git a/py/runtime.c b/py/runtime.c
index 9d93dbf..9fc0b97 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -23,8 +23,8 @@
 #if 0 // print debugging info
 #define DEBUG_PRINT (1)
 #define WRITE_CODE (1)
-#define DEBUG_printf(args...) printf(args)
-#define DEBUG_OP_printf(args...) printf(args)
+#define DEBUG_printf DEBUG_printf
+#define DEBUG_OP_printf(args...) DEBUG_printf(args)
 #else // don't print debugging info
 #define DEBUG_printf(args...) (void)0
 #define DEBUG_OP_printf(args...) (void)0
diff --git a/stm/printf.c b/stm/printf.c
index a062001..7bac07a 100644
--- a/stm/printf.c
+++ b/stm/printf.c
@@ -267,6 +267,17 @@
     return pfenv_printf(&pfenv_stdout, fmt, ap);
 }
 
+#if MICROPY_DEBUG_PRINTERS
+int DEBUG_printf(const char *fmt, ...) {
+    (void)stream;
+    va_list ap;
+    va_start(ap, fmt);
+    int ret = pfenv_printf(&pfenv_stdout, fmt, ap);
+    va_end(ap);
+    return ret;
+}
+#endif
+
 // need this because gcc optimises printf("%c", c) -> putchar(c), and printf("a") -> putchar('a')
 int putchar(int c) {
     char chr = c;
diff --git a/unix/main.c b/unix/main.c
index 8e6a76b..9d07b84 100644
--- a/unix/main.c
+++ b/unix/main.c
@@ -2,6 +2,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <stdarg.h>
 
 #include "nlr.h"
 #include "misc.h"
@@ -374,3 +375,11 @@
     }
     return MP_IMPORT_STAT_NO_EXIST;
 }
+
+int DEBUG_printf(const char *fmt, ...) {
+    va_list ap;
+    va_start(ap, fmt);
+    int ret = vfprintf(stderr, fmt, ap);
+    va_end(ap);
+    return ret;
+}