The backtrace_simple function seems to consistently invoke the callback
with an invalid -1UL value as the last entry, which seems to come from
_Unwind_Backtrace. The glibc backtrace(3) function has a special case to
not include that final invalid address, but libbacktrace doesn't seem to
handle it. Do so in std::stacktrace::current() instead.
libstdc++-v3/ChangeLog:
* include/std/stacktrace (basic_stacktrace::current): Call
_M_trim before returning.
(basic_stacktrace::_M_trim): New member function.
{
if (_S_current(__cb, std::__addressof(__ret)))
__ret._M_clear();
+ else
+ __ret._M_trim();
}
return __ret;
}
{
if (_S_current(__cb, std::__addressof(__ret), __skip))
__ret._M_clear();
+ else
+ __ret._M_trim();
}
return __ret;
}
}
}
+ else
+ __ret._M_trim();
}
return __ret;
}
}
};
+ void
+ _M_trim() noexcept
+ {
+ // libbacktrace adds an invalid -1UL entry at the end, remove it.
+ if (!empty() && !end()[-1])
+ _M_impl._M_resize(size() - 1, _M_alloc);
+ }
+
[[no_unique_address]] allocator_type _M_alloc{};
_Impl _M_impl{};