diff --git a/src/main.cc b/src/main.cc
index bced5e9a3872f1894b95b65ac18e6c0f4989be37..dd1840435158f12fbd27bd7a1d5ada6aeb615416 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -1,18 +1,26 @@
 #include <rlib/stdio.hpp>
 #include <rlib/opt.hpp>
+#include <rlib/sys/os.hpp>
 #include "common.hpp"
 
 rlib::logger rlog(std::cerr);
-
 using namespace rlib::literals;
 
-int main(int argc, char **argv) {
+#if RLIB_OS_ID == OS_WINDOWS
+    #include <thread>
+    using namespace std::chrono_literals;
+    #define windows_main main
+#else
+    #define real_main main
+#endif
+
+int real_main(int argc, char **argv) {
     rlib::opt_parser args(argc, argv);
     if(args.getBoolArg("--help", "-h")) {
-        rlib::println("Usage: {} -i $InboundConfig -o $OutboundConfig [--log=error/info/verbose/debug]"_rs.format(args.getSelf()));
-        rlib::println("  InboundConfig and OutboundConfig are in this format: ");
-        rlib::println("  '$method:$params', available methods: ");
-        rlib::println("  'plain:$addr:$port', 'misc:$addr:$portRange:$psk'");
+        rlog.info("Usage: {} -i $InboundConfig -o $OutboundConfig [--log=error/info/verbose/debug]"_rs.format(args.getSelf()));
+        rlog.info("  InboundConfig and OutboundConfig are in this format: ");
+        rlog.info("  '$method:$params', available methods: ");
+        rlog.info("  'plain:$addr:$port', 'misc:$addr:$portRange:$psk'");
         return 0;
     }
     auto inboundConfig = args.getValueArg("-i");
@@ -34,3 +42,18 @@ int main(int argc, char **argv) {
 
     return 0;
 }
+
+// This wrapper (maybe) makes debug easier. 
+int windows_main(int argc, char** argv) {
+    // fucking windows behaves strangely on exception. 
+    // Let's catch all exceptions and print. 
+    try {
+        return real_main(argc, argv);
+    }
+    catch (std::exception& e) {
+        rlog.fatal(e.what());
+        rlog.warning("Sleep 5s before exit...");
+        std::this_thread::sleep_for(5s);
+        return 2;
+    }
+}