c++ - boost::stacktrace 打印地址

标签 c++ bash boost stack-trace

我可以编译 boost:stacktrace 的所有示例。这是我的 bash 脚本:

#!/bin/bash

export CXX=~/x-tools/x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu-g++
export BOOST_INCLUDE=$HOME/x-libs/$($CXX -dumpmachine)/include
export BOOST_LIB=$HOME/x-libs/$($CXX -dumpmachine)/lib
export BOOST_SUFFIX="mt-d"
(ls $BOOST_LIB/*$BOOST_SUFFIX.a | tr "\n" "\0" | xargs -0 -n 1 basename | while read A; do B=-l$(echo $A | sed -e 's/^lib//' | sed -e 's/\.a//'); echo $B; done;) | tr "\n" " " > $BOOST_LIB/list_boost.txt
export BOOST_LIBS="cat $BOOST_LIB/list_boost.txt"
export EXECUTABLE_SUFFIX=""

$CXX -w -g3 -o assert_handler-$($CXX -dumpmachine)$EXECUTABLE_SUFFIX assert_handler.cpp -std=c++11 -static -I$BOOST_INCLUDE -L$BOOST_LIB $(eval $BOOST_LIBS) -ldl
$CXX -w -g3 -o debug_function-$($CXX -dumpmachine)$EXECUTABLE_SUFFIX debug_function.cpp -std=c++11 -static -I$BOOST_INCLUDE -L$BOOST_LIB $(eval $BOOST_LIBS) -ldl
$CXX -w -g3 -o terminate_handler-$($CXX -dumpmachine)$EXECUTABLE_SUFFIX terminate_handler.cpp -std=c++11 -static -I$BOOST_INCLUDE -L$BOOST_LIB $(eval $BOOST_LIBS) -ldl -lrt -lpthread
$CXX -w -g3 -o throwing_st-$($CXX -dumpmachine)$EXECUTABLE_SUFFIX throwing_st.cpp -std=c++11 -static -I$BOOST_INCLUDE -L$BOOST_LIB $(eval $BOOST_LIBS) -ldl
$CXX -w -g3 -o trace_addresses-$($CXX -dumpmachine)$EXECUTABLE_SUFFIX trace_addresses.cpp -std=c++11 -static -I$BOOST_INCLUDE -L$BOOST_LIB $(eval $BOOST_LIBS)
$CXX -w -g3 -o user_config-$($CXX -dumpmachine)$EXECUTABLE_SUFFIX user_config.cpp -std=c++11 -static -I$BOOST_INCLUDE -L$BOOST_LIB $(eval $BOOST_LIBS) -ldl

生成的 boost 列表如下所示:

-lboost_atomic-mt-d -lboost_chrono-mt-d -lboost_container-mt-d -lboost_context-mt-d -lboost_coroutine-mt-d -lboost_date_time-mt-d -lboost_exception-mt-d -lboost_fiber-mt-d -lboost_filesystem-mt-d -lboost_graph-mt-d -lboost_iostreams-mt-d -lboost_locale-mt-d -lboost_log-mt-d -lboost_log_setup-mt-d -lboost_math_c99f-mt-d -lboost_math_c99l-mt-d -lboost_math_c99-mt-d -lboost_math_tr1f-mt-d -lboost_math_tr1l-mt-d -lboost_math_tr1-mt-d -lboost_prg_exec_monitor-mt-d -lboost_program_options-mt-d -lboost_random-mt-d -lboost_regex-mt-d -lboost_serialization-mt-d -lboost_signals-mt-d -lboost_stacktrace_addr2line-mt-d -lboost_stacktrace_basic-mt-d -lboost_stacktrace_noop-mt-d -lboost_system-mt-d -lboost_test_exec_monitor-mt-d -lboost_thread-mt-d -lboost_timer-mt-d -lboost_type_erasure-mt-d -lboost_unit_test_framework-mt-d -lboost_wave-mt-d -lboost_wserialization-mt-d 

如果我运行一个示例,它会打印指针:

./assert_handler-x86_64-unknown-linux-gnu 
Expression 'i < N' is false in function 'T& boost::array<T, N>::operator[](boost::array<T, N>::size_type) [with T = int; long unsigned int N = 5ul; boost::array<T, N>::reference = int&; boost::array<T, N>::size_type = long unsigned int]': out of range.
Backtrace:
 0# 0x00000000004019B2
 1# 0x0000000000401B39
 2# 0x0000000000400E3B
 3# 0x0000000000400E6B
 4# 0x0000000000400E44
 5# 0x0000000000400E6B
 6# 0x0000000000400E7C
 7# 0x000000000045BF2B
 8# 0x000000000045C1D1
 9# 0x0000000000400CEA

我错过了什么吗?

最佳答案

现在为我工作。

  1. boost::stacktrace 需要 libbacktrace 来打印比指针更多的信息
  2. 编译器需要-lbacktrace -DBOOST_STACKTRACE_USE_BACKTRACE

上面的 bash 脚本示例中完整的编译行是:

$CXX -w -g3 -o assert_handler-$($CXX -dumpmachine)$EXECUTABLE_SUFFIX assert_handler.cpp -std=c++11 -static -I$BOOST_INCLUDE -L$BOOST_LIB $(eval $BOOST_LIBS) -ldl -lbacktrace -DBOOST_STACKTRACE_USE_BACKTRACE

boost::stacktrace 是当前 Boost v1.65.1 中的新功能,而我使用的 Debian Stretch 只有 v1.62.0,不提供 libbacktrace。所以我不得不自己下载/编译这两个。

我交叉编译 x86_64-unknown-linux-gnu 和 i686-w64-mingw32。它适用于 Linux,但 mingw 可执行文件几乎不打印任何内容。我会对此进行调查,并可能稍后在此处发布我的结果。

关于c++ - boost::stacktrace 打印地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46753673/

相关文章:

c++ - 为什么std::list<string> work but not std::list<int>

java - 如何将 C++ 类连接到 Java?

c++ - 错误 : 'myfile' was not declared in this scope

c++ - RPC:永不消亡的子进程

linux - 如何在命令行中从脚本运行函数?

linux - 如何修复 bash 中的错误替换错误?

bash - 在没有 make 的情况下安装 make 命令(mac os 10.5)

c++ - 如何从 boost 多数组中获取最大/最小元素

c++ - 从 json 文件构建 boost 属性树性能很差?

c++ - 是否有 split_copy 或某种快捷方式