You can find the documentation at
http://apolukhin.github.io/stacktrace/index.html and the github repo
at https://github.com/apolukhin/stacktrace.
The heuristic that skips 3 frames (under Windows) doesn't quite work. It
seems that MSVC in whole program optimization mode ignores BOOST_NOINLINE
directives and makes inline decisions that differ in unpredictable ways
between compiles. This program, for instance:
#include
#include <iostream>
#include <algorithm>
#include <functional>
void g( int x )
{
boost::stacktrace::stacktrace st( -3, -1 );
std::cout << st << std::endl;
}
void f( int x )
{
std::function h( g );
std::for_each( &x, &x + 1, g );
}
int main()
{
f( 1 );
}
gives this trace:
0# boost::stacktrace::detail::this_thread_frames::collect at
c:\projects\boost-git\boost\boost\stacktrace\detail\frame_msvc.ipp:48
1# g at c:\projects\testbed2017\testbed2017.cpp:9
2# main at c:\projects\testbed2017\testbed2017.cpp:20
3# __scrt_common_main_seh at
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:259
4# BaseThreadInitThunk in kernel32
5# RtlInitializeExceptionChain in ntdll
6# RtlInitializeExceptionChain in ntdll
With the default constructor, #0, #1 and #2 disappear and nothing useful
remains.
There should probably be a way to optionally remove the +1 and +2 hardcoded
skips because passing a nonportable -3 to a size_t is not exactly a best
practice.