我正在查看boost::stacktrace::safe_dump_to
API,但我终其一生都无法确定如何确定为safe_dump_to()
调用分配多少空间。如果我通过(nullptr, 0)
,它只是返回0
,所以不是这样。我可以猜到一些常数,但我怎么知道这就足够了?
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
构造被设计为异步安全的,所以我总是只使用写入文件的重载。读回它时(通常在重新启动后),您将能够从文件大小中推断出帧数。
可以选择查看我的一些答案以获取代码示例/更多背景信息