2

我正在查看boost::stacktrace::safe_dump_toAPI,但我终其一生都无法确定如何确定为safe_dump_to()调用分配多少空间。如果我通过(nullptr, 0),它只是返回0,所以不是这样。我可以猜到一些常数,但我怎么知道这就足够了?

4

1 回答 1

1

文档指定:

此标头包含用于转储调用堆栈的低级异步信号安全函数。转储是 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,但无论如何都没有异步安全的动态分配方式,因此您只需选择一个适合您的应用程序的数字。例如,256 帧可能是合理的,但您应该查看自己的需求(例如,DEBUG 构建将显示更多的堆栈帧,尤其是对于严重依赖模板泛型、YMMV 的代码)。

由于整个safe_dump_to构造被设计为异步安全的,所以我总是只使用写入文件的重载。读回它时(通常在重新启动后),您将能够从文件大小中推断出帧数。

可以选择查看我的一些答案以获取代码示例/更多背景信息

于 2020-08-05T01:33:43.483 回答