Boost C++ 库

……世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

配置与构建 - Boost C++ 函数库
PrevUpHomeNext

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、Windows 上的 Intel

其他平台的默认值

boost_stacktrace_basic

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

POSIX 或 MinGW 上的任何编译器

BOOST_STACKTRACE_USE_WINDBG_CACHED

boost_stacktrace_windbg_cached

使用 dbgeng.h 显示调试信息,并在 TLS 中缓存实现内部以提高性能。仅适用于需要非常频繁地收集跟踪的场景。可能需要链接 ole32dbgeng

MSVC、Windows 上的 Intel

BOOST_STACKTRACE_USE_BACKTRACE

boost_stacktrace_backtrace

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

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

POSIX、MinGW 或 MinGW-w64 上的任何编译器

BOOST_STACKTRACE_USE_ADDR2LINE

boost_stacktrace_addr2line

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

POSIX 上的任何编译器

BOOST_STACKTRACE_USE_NOOP

boost_stacktrace_noop

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

所有

[a] 如果使用调试信息构建二进制文件,这将提供更易读的回溯,包括源代码位置

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

[c] 某些 libbacktrace 包在与同一 backtrace_state 实例并发工作时会 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 文件以及您的应用程序,有多种方法可以处理此问题:

  • 使用正确设置的 /PDBALTPATH 标志链接您的应用程序和共享库,例如 /PDBALTPATH:%_PDB%。有关更多信息,请参阅 官方文档
  • 将目标系统的 _NT_ALT_SYMBOL_PATH_NT_SYMBOL_PATH 环境变量设置为 PDB 的路径。有关更多信息,请参阅 官方文档

PrevUpHomeNext