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、Windows 上的 Intel |
是 |
否 |
其他平台的默认值 |
boost_stacktrace_basic |
使用编译器内建函数收集堆栈跟踪,并在可能的情况下使用 |
POSIX 或 MinGW 上的任何编译器 |
否 |
是 |
BOOST_STACKTRACE_USE_WINDBG_CACHED |
boost_stacktrace_windbg_cached |
使用 |
MSVC、Windows 上的 Intel |
是 |
否 |
BOOST_STACKTRACE_USE_BACKTRACE |
boost_stacktrace_backtrace |
在 POSIX 上需要链接 libdl 和 libbacktrace 库[c]。libbacktrace 可能已安装在您的系统中[d],或已内置到您的编译器中。 |
POSIX、MinGW 或 MinGW-w64 上的任何编译器 |
是 |
是 |
BOOST_STACKTRACE_USE_ADDR2LINE |
boost_stacktrace_addr2line |
使用 addr2line 程序检索堆栈跟踪。需要链接 libdl 库和 |
POSIX 上的任何编译器 |
是 |
是 |
BOOST_STACKTRACE_USE_NOOP |
boost_stacktrace_noop |
如果您希望禁用回溯,请使用此选项。 |
所有 |
否 |
否 |
[a] 如果使用调试信息构建二进制文件,这将提供更易读的回溯,包括源代码位置。 [b] 这将为二进制文件导出的函数在回溯中提供易读的函数名。使用 [c] 某些 libbacktrace 包在与同一 [d] 如果您使用的是 Clang 和 libstdc++,可能会在包含 |
示例
MinGW-w64 和 MinGW(无 -w64)用户必须安装 libbacktrace 才能获得更好的堆栈跟踪。请遵循以下说明:
假设您已将 MinGW 安装到 C:\MinGW,并将 libbacktrace 源代码 下载到 C:\libbacktrace-master
将应用程序部署到不同系统后,函数名称可能无法解析。
如果您分发 PDB 文件以及您的应用程序,有多种方法可以处理此问题: