bombela / backward-cpp

A beautiful stack trace pretty printer for C++
MIT License
3.73k stars 471 forks source link

space after numbers on windows #204

Closed rulerofthehuns closed 3 years ago

rulerofthehuns commented 3 years ago

Hi,

There are 3 spaces after every number in the stacktrace output on windows:

D:\dev\projects\backtracetest\build-win\bin>main 0
------------------------
Stack trace (most recent call last):
#9          Object "", at 0   0   0   0   7   F   F   8   6   D   A   2   7   0   3   4   , in BaseThreadInitThunk
#8          Source "d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp", line 1   7   , in mainCRTStartup
#7          Source "d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl", line 3   3   1   , in __scrt_common_main
#6          Source "d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl", line 2   8   8   , in __scrt_common_main_seh
#5          Source "d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl", line 7   9   , in invoke_main
#4          Source "D:\dev\projects\backtracetest\main.cpp", line 1   7   2   , in main
           1   6   9   :     // testfunc();
           1   7   0   :
           1   7   1   :     helper(argc, argv);
      >    1   7   2   :     return 0;
           1   7   3   : }
#3          Source "D:\dev\projects\backtracetest\main.cpp", line 6   5   , in helper
               6   2   :         {
               6   3   :             case str2int("0"):
               6   4   :                 print_backtrace();
      >        6   5   :                 break;
               6   6   :             case str2int("1"):
               6   7   :                 lib1_pst();
               6   8   :                 break;
#2          Source "D:\dev\projects\backtracetest\pst.h", line 1   1   0   , in print_backtrace
           1   0   8   :     // throw new int();
           1   0   9   :     // *(int *)0 = 42;
      >    1   1   0   : }
           1   1   1   :
           1   1   2   :
           1   1   3   : static void crash()
#1          Source "D:\dev\projects\backtracetest\pst.h", line 6   5   , in do_print_backtrace
               6   3   :     StackTrace st;
               6   4   :     st.load_here(32);
      >        6   5   :     Printer p;
               6   6   :     //p.color_mode = ColorMode::never;
               6   7   :
               6   8   :     p.print(st);
#0          Source "D:\dev\projects\backtracetest\backward.hpp", line 1   1   3   0   , in backward::StackTraceImpl<backward::system_tag::windows_tag>::load_here
       1   1   2   7   :       RtlCaptureContext(ctx_);
       1   1   2   8   :     }
       1   1   2   9   :
      >1   1   3   0   :     if (!thd_) {
       1   1   3   1   :       thd_ = GetCurrentThread();
       1   1   3   2   :     }

But the same executable works as expected while debugging from vscode or if I pipe the stdout to a file ( note: the stacktrace goes to stderr, not stdout ):

D:\dev\projects\backtracetest\build-win\bin>main 0 > out.txt
Stack trace (most recent call last):
#9    Object "", at 00007FF86DA27034, in BaseThreadInitThunk
#8    Source "d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp", line 17, in mainCRTStartup
#7    Source "d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl", line 331, in __scrt_common_main
#6    Source "d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl", line 288, in __scrt_common_main_seh
#5    Source "d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl", line 79, in invoke_main
#4    Source "D:\dev\projects\backtracetest\main.cpp", line 172, in main
        169:     // testfunc();
        170:
        171:     helper(argc, argv);
      > 172:     return 0;
        173: }
#3    Source "D:\dev\projects\backtracetest\main.cpp", line 65, in helper
         62:         {
         63:             case str2int("0"):
         64:                 print_backtrace();
      >  65:                 break;
         66:             case str2int("1"):
         67:                 lib1_pst();
         68:                 break;
#2    Source "D:\dev\projects\backtracetest\pst.h", line 110, in print_backtrace
        108:     // throw new int();
        109:     // *(int *)0 = 42;
      > 110: }
        111:
        112:
        113: static void crash()
#1    Source "D:\dev\projects\backtracetest\pst.h", line 65, in do_print_backtrace
         63:     StackTrace st;
         64:     st.load_here(32);
      >  65:     Printer p;
         66:     //p.color_mode = ColorMode::never;
         67:
         68:     p.print(st);
#0    Source "D:\dev\projects\backtracetest\backward.hpp", line 1130, in backward::StackTraceImpl<backward::system_tag::windows_tag>::load_here
       1127:       RtlCaptureContext(ctx_);
       1128:     }
       1129:
      >1130:     if (!thd_) {
       1131:       thd_ = GetCurrentThread();
       1132:     }

The same code on works fine on WSL Ubuntu. I'm using Visual Studio 2019 community edition, 19.25.28614.0