Boost C++ 库

...世界上最受推崇和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码标准

PrevUpHomeNext

配置和构建

CMake 的用法
CMake 构建注意事项
B2 构建注意事项
仅头文件选项
MinGW 和 MinGW-w64 特定注意事项
Windows 部署和符号文件

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 实现,并强制构建 backtracefrom_exception
  • cmake -DBOOST_STACKTRACE_ENABLE_NOOP=1 -DBOOST_STACKTRACE_ENABLE_WINDBG=1 -DBOOST_STACKTRACE_ENABLE_WINDBG_CACHED=0 - 构建 noopwindbg 实现,并禁用 windbg_cached 的构建。

如果未提供选项,则会自动检测,检测结果会被打印并在构建期间隐式使用。

当使用 b2 构建 Boost.Stacktrace 库时,boost.stacktrace.* 选项可用于控制构建。例如

  • b2 boost.stacktrace.noop=off boost.stacktrace.backtrace=on boost.stacktrace.from_exception=on - 不构建 noop 实现,并强制构建 backtracefrom_exception
  • b2 boost.stacktrace.noop=on boost.stacktrace.windbg=on boost.stacktrace.windbg_cached=off - 构建 noopwindbg 实现,并禁用 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

使用 dbgeng.h 显示调试信息,将实现内部存储在受互斥锁保护的静态变量中。可能需要链接 ole32dbgeng

MSVC, MinGW-w64, Intel on Windows

其他平台的默认值

boost_stacktrace_basic

使用编译器 intrinsics 收集堆栈跟踪,并在可能的情况下使用 ::dladdr 显示有关符号的信息。需要在 POSIX 平台上链接 libdl 库。

Any compiler on POSIX or MinGW

BOOST_STACKTRACE_USE_WINDBG_CACHED

boost_stacktrace_windbg_cached

使用 dbgeng.h 显示调试信息,并将实现内部缓存到 TLS 中以获得更好的性能。仅在非常频繁地收集跟踪的情况下有用。可能需要链接 ole32dbgeng

MSVC, Intel on Windows

BOOST_STACKTRACE_USE_BACKTRACE

boost_stacktrace_backtrace

需要在 POSIX 上链接 libdllibbacktrace[c]libbacktrace 可能已安装在您的系统中[d],或内置于您的编译器中。

否则(例如,如果您是 MinGW/MinGW-w64 用户),可以从此处此处下载。

Any compiler on POSIX, or MinGW, or MinGW-w64

BOOST_STACKTRACE_USE_ADDR2LINE

boost_stacktrace_addr2line

使用 addr2line 程序检索堆栈跟踪。需要链接 libdl 库和 ::fork 系统调用。如果 addr2line 可执行文件不在 /usr/bin/addr2line 中,则必须将宏 BOOST_STACKTRACE_ADDR2LINE_LOCATION 定义为 addr2line 可执行文件的绝对路径。

Any compiler on POSIX

BOOST_STACKTRACE_USE_NOOP

boost_stacktrace_noop

如果您希望禁用回溯,请使用此选项。使用该宏的 stacktrace::size() 始终返回 0。

所有

[a] 如果二进制文件是用调试信息构建的,这将提供更具可读性的堆栈跟踪,并带有源代码位置

[b] 这将为二进制文件导出的函数在堆栈跟踪中提供可读的函数名称。使用 -rdynamic 标志编译,不使用 -fvisibility=hidden 或将函数标记为导出,可以生成更好的堆栈跟踪。

[c] 如果与同一个 backtrace_state 实例存在并发工作,某些 libbacktrace 包会发生 SEGFAULT。为了避免这个问题,Boost.Stacktrace 库使用 thread_local 状态,但不幸的是,如果您经常在应用程序中创建和销毁执行线程,这可能会消耗大量内存。定义 BOOST_STACKTRACE_BACKTRACE_FORCE_STATIC 以强制单实例,但请确保 thread_safety_checking.cpp 在您的设置中运行良好。

[d] 如果您将 Clang 与 libstdc++ 一起使用,则可能会遇到包含 <backtrace.h> 的问题,因为在某些平台上,Clang 不会在 GCC 的包含路径中搜索头文件,并且任何添加 GCC 包含路径的尝试都会导致链接器错误。要显式指定 <backtrace.h> 头的路径,您可以将 BOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE 定义为头的完整路径。例如,在 Ubuntu Xenial 上,在使用 Clang 构建时,请使用命令行选项 -DBOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE=</usr/lib/gcc/x86_64-linux-gnu/5/include/backtrace.h>


示例

  • 如果您希望在 Clang/MinGW 上切换到更强大的实现,并且定义了 BOOST_STACKTRACE_LINK,您只需要链接 "-lboost_stacktrace_backtrace -ldl -lbacktrace" 或 "-lboost_stacktrace_addr2line -ldl"
  • 如果您希望禁用回溯,并且定义了 BOOST_STACKTRACE_LINK,您只需要链接 -lboost_stacktrace_noop
  • 如果您希望禁用回溯,并且您在仅头文件模式下使用该库,您只需要为整个项目定义 BOOST_STACKTRACE_USE_NOOP 并重新编译它

MinGW-w64 和 MinGW(不带 -w64)用户必须安装 libbacktrace 才能获得更好的堆栈跟踪。请按照说明操作

假设您已将 MinGW 安装到 C:\MinGW,并将 libbacktrace 源代码下载到 C:\libbacktrace-master

  • 从控制台配置和构建 libbacktrace
    • C:\MinGW\msys\1.0\bin\sh.exe
    • cd /c/libbacktrace-master
    • ./configure CC=/c/MinGW/bin/gcc.exe CXX=/c/MinGW/bin/g++.exe
    • make
    • ./libtool --mode=install /usr/bin/install -c libbacktrace.la '/c/libbacktrace-master'
  • 将信息添加到 Boost 文件夹中的 project-config.jam
    • using gcc : 6 : "C:\MinGW\bin\g++.exe" : <compileflags>-I"C:\libbacktrace-master\" <linkflags>-L"C:\libbacktrace-master\" ;
  • 现在,您可以通过为项目定义 BOOST_STACKTRACE_USE_BACKTRACE 或从 Boost 文件夹构建 stacktrace 库来使用仅头文件版本
    • b2.exe toolset=gcc-6 --with-stacktrace

将应用程序部署到不同的系统后,可能无法解析函数名称。

如果您随应用程序分发 PDB 文件,则有多种方法可以解决该问题


PrevUpHomeNext