CMake 库 Boost::stacktrace
提供了最佳可用实现
target_link_libraries(${PROJECT} PUBLIC Boost::stacktrace )
还有一些 CMake 库可用于精细选择实现
Boost::stacktrace_windbg
Boost::stacktrace_windbg_cached
Boost::stacktrace_backtrace
Boost::stacktrace_addr2line
Boost::stacktrace_basic
Boost::stacktrace_noop
请注意,Boost::stacktrace_from_exception
默认不使用,因此如果需要其功能,请显式添加它
target_link_libraries(${PROJECT} # your project PUBLIC Boost::stacktrace Boost::stacktrace_from_exception )
当使用 CMake
构建 Boost.Stacktrace 库时,BOOST_STACKTRACE_ENABLE_*
选项控制构建。例如
cmake -DBOOST_STACKTRACE_ENABLE_NOOP=0 -DBOOST_STACKTRACE_ENABLE_BACKTRACE=1 -DBOOST_STACKTRACE_ENABLE_FROM_EXCEPTION=1
- 不构建 noop
实现,并强制构建 backtrace
和 from_exception
。cmake -DBOOST_STACKTRACE_ENABLE_NOOP=1 -DBOOST_STACKTRACE_ENABLE_WINDBG=1 -DBOOST_STACKTRACE_ENABLE_WINDBG_CACHED=0
- 构建 noop
和 windbg
实现,并禁用 windbg_cached
的构建。如果未提供选项,则会自动检测,检测结果会被打印并在构建期间隐式使用。
当使用 b2
构建 Boost.Stacktrace 库时,boost.stacktrace.*
选项可用于控制构建。例如
b2 boost.stacktrace.noop=off boost.stacktrace.backtrace=on boost.stacktrace.from_exception=on
- 不构建 noop
实现,并强制构建 backtrace
和 from_exception
。b2 boost.stacktrace.noop=on boost.stacktrace.windbg=on boost.stacktrace.windbg_cached=off
- 构建 noop
和 windbg
实现,并禁用 windbg_cached
的构建。如果未提供选项,则会自动检测,检测结果会被打印并在构建期间隐式使用。
如果未使用 CMake,则 Boost.Stacktrace 默认是仅头文件库。要更改这一点(以提高构建时间或能够在不重新编译项目的情况下调整库),请使用以下宏
表 34.1. 链接宏
宏名称 |
效果 |
---|---|
BOOST_STACKTRACE_LINK |
禁用仅头文件构建,并要求链接包含跟踪实现的共享库或静态库。如果定义了 BOOST_ALL_DYN_LINK,则链接共享库。 |
BOOST_STACKTRACE_DYN_LINK |
禁用仅头文件构建,并要求链接包含跟踪实现的共享库。 |
在仅头文件模式下,库可以通过宏进行调整。如果定义了上述链接宏之一,则必须手动链接其中一个库
表 34.2. 配置
宏名称或默认值 |
库 |
效果 |
平台 |
使用调试信息 [a] |
使用动态导出信息 [b] |
---|---|---|---|---|---|
MSVC、Windows 上的 Intel、MinGW-w64 的默认值 / BOOST_STACKTRACE_USE_WINDBG |
boost_stacktrace_windbg |
使用 |
MSVC, MinGW-w64, Intel on Windows |
是 |
否 |
其他平台的默认值 |
boost_stacktrace_basic |
使用编译器 intrinsics 收集堆栈跟踪,并在可能的情况下使用 |
Any compiler on POSIX or MinGW |
否 |
是 |
BOOST_STACKTRACE_USE_WINDBG_CACHED |
boost_stacktrace_windbg_cached |
使用 |
MSVC, Intel on Windows |
是 |
否 |
BOOST_STACKTRACE_USE_BACKTRACE |
boost_stacktrace_backtrace |
需要在 POSIX 上链接 libdl 和 libbacktrace 库[c]。 libbacktrace 可能已安装在您的系统中[d],或内置于您的编译器中。 |
Any compiler on POSIX, or MinGW, or MinGW-w64 |
是 |
是 |
BOOST_STACKTRACE_USE_ADDR2LINE |
boost_stacktrace_addr2line |
使用 addr2line 程序检索堆栈跟踪。需要链接 libdl 库和 |
Any compiler on POSIX |
是 |
是 |
BOOST_STACKTRACE_USE_NOOP |
boost_stacktrace_noop |
如果您希望禁用回溯,请使用此选项。使用该宏的 |
所有 |
否 |
否 |
[a] 如果二进制文件是用调试信息构建的,这将提供更具可读性的堆栈跟踪,并带有源代码位置。 [b] 这将为二进制文件导出的函数在堆栈跟踪中提供可读的函数名称。使用 [c] 如果与同一个 [d] 如果您将 Clang 与 libstdc++ 一起使用,则可能会遇到包含 |
示例
MinGW-w64 和 MinGW(不带 -w64)用户必须安装 libbacktrace 才能获得更好的堆栈跟踪。请按照说明操作
假设您已将 MinGW 安装到 C:\MinGW,并将 libbacktrace 源代码下载到 C:\libbacktrace-master
将应用程序部署到不同的系统后,可能无法解析函数名称。
如果您随应用程序分发 PDB 文件,则有多种方法可以解决该问题
/PDBALTPATH
标志链接您的应用程序和共享库,例如 /PDBALTPATH:%_PDB%
。请参阅官方文档以获取更多信息。_NT_ALT_SYMBOL_PATH
或 _NT_SYMBOL_PATH
环境变量设置为 PDB 的路径。请参阅官方文档以获取更多信息。