Backward-cpp – A stack trace pretty-printer for C++
github.com
github.com
Basically you just add "-fsanitize=address" and link appropriately:
gcc -pthread -fno-omit-frame-pointer -g -fsanitize=address badass.c -lasan -ldl
./a.out
==22420== ERROR: AddressSanitizer crashed on address 0x0000200000703c18 at pc 0x401947
READ of size 1 at 0x0000200000703c18; shadow: 0x0000100000381e0c; mem: 0x0000000001c0f065 thread: 0x787d4720
#0 0x401947 main use-after-free.c:5
#1 0x7ff87792cc4d __libc_start_main ??:0
#2 0x401839 _start ??:0
0x0000000001c0f065 is located 5 bytes inside of 80-byte region [0x0000000001c0f060,0x0000000001c0f0b0)
freed by thread 0x787d4720 here:
#0 0x404b9b free asan_rtl.cc:1203
#1 0x40191b main use-after-free.c:5
#2 0x7ff87792cc4d __libc_start_main ??:0
#3 0x401839 _start ??:0
previously allocated by thread 0x787d4720 here:
#0 0x405c27 malloc asan_rtl.cc:1196
#1 0x401910 main use-after-free.c:3
#2 0x7ff87792cc4d __libc_start_main ??:0
#3 0x401839 _start ??:0
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...
http://www.mixtion.org/gccfilter/
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.
Reminds me of tiny-cc's default output for segfaults.
$ 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 scopeThanks again for the really useful open source contribution! I will be integrating this with my C++ projects.
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.
:(
I think this eases the workflow if you're not always running the application from within gdb.
Btw, does gdb expand inline calls in the backtrace?