boost :: stacktrace :: safe_dump_to выходной размер - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь сохранить трассировку стека в сырую память, используя функцию 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?

1 Ответ

0 голосов
/ 02 сентября 2018

Просто используйте тот же размер на обратной стороне:

const auto st = boost::stacktrace::stacktrace::from_dump(buf.data(), buf.size());

В конце концов, вы использовали это ограничение при записи дампа, поэтому размер, как известно, меньше этого.

Live On Coliru

#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(), buf.size());

    std::cout << "ST from dump (" << size << " frames): " << st << std::endl
              << "ST: " << boost::stacktrace::stacktrace{} << std::endl;
}

печать

ST from dump (4 frames):  0# 0x00000000004016B9 in ./a.out
 1# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
 2# 0x0000000000401869 in ./a.out

ST:  0# 0x00000000004017AF in ./a.out
 1# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
 2# 0x0000000000401869 in ./a.out

UPDATE

Как уже упоминалось в комментарии, в документах есть небольшой кусочек о safe_dump_to здесь

Дампы - это двоичные сериализованные массивы void*, поэтому вы можете прочитать их, используя od -tx8 -An stacktrace_dump_failename команду Linux или boost::stacktrace::stacktrace::from_dump функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...