diff --git a/src/c_wrapper/debug.cpp b/src/c_wrapper/debug.cpp
index 95cb808432c7aaccfa3287eb413a323c0a5d8290..fbc69c908948b51da033b20c8ee1eb3b91f44d5d 100644
--- a/src/c_wrapper/debug.cpp
+++ b/src/c_wrapper/debug.cpp
@@ -7,9 +7,33 @@ namespace pyopencl {
 void
 dbg_print_str(std::ostream &stm, const char *str, size_t len)
 {
-    // TODO escape
     stm << '"';
-    stm.write(str, len);
+    for (size_t i = 0;i < len;i++) {
+        char escaped = 0;
+#define escape_char(in, out)                    \
+        case in:                                \
+            escaped = out;                      \
+            break
+        switch (str[i]) {
+            escape_char('\'', '\'');
+            escape_char('\"', '\"');
+            escape_char('\?', '\?');
+            escape_char('\\', '\\');
+            escape_char('\0', '0');
+            escape_char('\a', 'a');
+            escape_char('\b', 'b');
+            escape_char('\f', 'f');
+            escape_char('\r', 'r');
+            escape_char('\v', 'v');
+        default:
+            break;
+        }
+        if (escaped) {
+            stm << '\\' << escaped;
+        } else {
+            stm << str[i];
+        }
+    }
     stm << '"';
 }