Я пытаюсь сохранить трассировку стека в сырую память, используя функцию boost::stacktrace::safe_dump_to(void*, std::size_t)
, однако функция возвращает количество записанных кадров стека (плюс завершающий кадр) - не количество записанных байтов .
Это означает, что когда я прихожу, чтобы прочитать эти данные, я понятия не имею, что поместить в поле размера boost::stacktrace::stacktrace::from_dump(const void *, std::size_t, const allocator_type &)
. Сначала я предположил, что могу использовать sizeof(boost::stacktrace::frame) * frames
, но тип frame
содержит выделенную память для кучи (std::string
s), так что это не будет работать.
Это SSCE демонстрирует проблему:
#include <iostream>
#include <boost/stacktrace.hpp>
int main()
{
auto buf = std::array<char, 8192>{};
const auto size = boost::stacktrace::safe_dump_to(buf.data(), buf.size());
const auto st = boost::stacktrace::stacktrace::from_dump(buf.data(), size);
std::cout << "ST from dump (" << size << " bytes): " << st << std::endl
<< "ST: " << boost::stacktrace::stacktrace{} << std::endl;
return EXIT_SUCCESS;
}
Выводит:
ST from dump (4 bytes):
ST: 0# 0x00000000004016A7 in ./a.out
1# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
2# 0x0000000000401759 in ./a.out
Вторая строка 'ST' просто показывает, что ожидается. Первая строка терпит неудачу, потому что я пытаюсь обработать число кадров как размер байта, который, очевидно, не равен.
Так, как должен использоваться API?