Author of the code here. Yes, this is cool, but it instruments your code "This tool is very fast. The average slowdown of the instrumented program is ~2x (see PerformanceNumbers).". backward-cpp doesn't change the generated code in any way. This is only using the debug informations. There is no performance impact, the binary code stays the same.
What I need, moreso than this, is a tool for parsing really long and winding multi-screen error messages involving templates (screw up a std::map key or value? At least 100 characters in the error message just to describe it. Add an additional 50 if you try to use string [basic_string ...])
In our project we use gccfilter with the options -c and -p which are colorize and remove path but it supports as well -a for removing the template arguments. Give it a try it will definitely help your.
There is no need to fire up gdb in the example case on the backward-cpp Github page because it's a trivial example (dereferencing an obviously invalid pointer), but to say it eliminates the need for gdb to debug segfaults in general is a bit of an overstatement.
I get errors when I try to compile it on my system.
$ g++ -v
gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)
$ g++ -c backward.cpp
In file included from backward.cpp:26:
backward.hpp: In member function ‘_Unwind_Reason_Code backward::details::Unwinder<F>::backtrace(_Unwind_Context*)’:
backward.hpp:595: error: there are no arguments to ‘_Unwind_GetIPInfo’ that depend on a template parameter, so a declaration of ‘_Unwind_GetIPInfo’ must be available
backward.hpp:595: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
backward.hpp: In member function ‘_Unwind_Reason_Code backward::details::Unwinder<F>::backtrace(_Unwind_Context*) [with F = backward::StackTraceImpl<backward::system_tag::linux_tag>::callback]’:
backward.hpp:587: instantiated from ‘static _Unwind_Reason_Code backward::details::Unwinder<F>::backtrace_trampoline(_Unwind_Context*, void*) [with F = backward::StackTraceImpl<backward::system_tag::linux_tag>::callback]’
backward.hpp:576: instantiated from ‘size_t backward::details::Unwinder<F>::operator()(F&, size_t) [with F = backward::StackTraceImpl<backward::system_tag::linux_tag>::callback]’
backward.hpp:612: instantiated from ‘size_t backward::details::unwind(F, size_t) [with F = backward::StackTraceImpl<backward::system_tag::linux_tag>::callback]’
backward.hpp:628: instantiated from here
backward.hpp:595: error: ‘_Unwind_GetIPInfo’ was not declared in this scope
Hey, I am not the OP, but the author of the code. So it seems that the function is not always declared in some header, while it exists in libgcc. Can you add an issue on github? Meanwhile, you can set the #define BACKWARD_HAS_BACKTRACE=1 which will disable the use of "unwind". You will get slightly less accurate stack trace (especially on CPU exception and other signals), but it should work ok until this bug is fixed.
I was hoping for an actual 'reverse cpp': a tool that took preprocessed C source code and undoes macro expansions. I mean, it should read some C source and some header files, and use the macro definitions found in the header files to try and shorten the source code.
It does, because it uses the debug information generated by the compiler. both clang and gcc produce a good quality DWARF (http://www.dwarfstd.org/), which contains everything needed to unwind the stack. In Bacward-cpp I do use the unwinder provided by libgcc, which is in fact extracting all the information from DWARF. This is as accurate as GDB can be, it uses the same debug information.
Basically you just add "-fsanitize=address" and link appropriately:
See the changelog [1] as well as the library [2] itself. Of course, the OP's project is certainly cool too.[1]: http://gcc.gnu.org/gcc-4.8/changes.html
[2]: https://code.google.com/p/address-sanitizer/wiki/AddressSani...