Как определить, сколько места выделить для boost :: stacktrace :: safe_dump_to? - PullRequest
2 голосов
/ 05 августа 2020

Я смотрю на boost::stacktrace::safe_dump_to API и не могу понять, как определить, сколько места выделить для вызова safe_dump_to(). Если я передам (nullptr, 0), он просто вернет 0, так что это не так. Я мог бы угадать какое-нибудь постоянное число, но откуда мне знать, что этого достаточно?

1 Ответ

1 голос
/ 05 августа 2020

В документах указывается:

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

И дополнительно

Возвращает:

Глубина сохраненной последовательности вызовов, включая завершающий нулевой кадр. Чтобы получить фактически использованные байты, умножьте это значение на sizeof (boost :: stacktrace :: frame :: native_frame_ptr_t))

Это не слишком явно, но это означает, что вам нужно sizeof(boost::stacktrace::frame::native_frame_ptr_t)*N, где N - количество кадров стека в трассировке.

Теперь, конечно, вы можете узнать N, но не существует asyn c -safe способа динамического распределения в любом случае, поэтому вам просто нужно выбрать номер, подходящий для вашего приложения. Например, 256 кадров могут быть разумными, но вы должны учитывать свои собственные потребности (например, сборки DEBUG будут отображать намного больше кадров стека, особенно с кодом, который сильно зависит от универсальных шаблонов, YMMV).

Поскольку вся конструкция safe_dump_to предназначена для асинхронной c -безопасной, я всегда просто использую перегрузку , которая записывает в файл . При повторном чтении (обычно после перезапуска) вы сможете определить количество кадров из размера файла.

При желании см. некоторые из моих ответов примеры кода / дополнительная справочная информация

...