提升堆栈跟踪出空源文件和行号

问题描述 投票:0回答:1

我使用以下代码

#include <boost/stacktrace.hpp>
#include <iostream>
#include <stdexcept>

// Define a custom exception type
struct CustomException : std::runtime_error {
    CustomException(const std::string& msg) : std::runtime_error(msg) {}
};

// Function to throw an error with message and stack trace
void throw_err(const std::string& err_msg) {
    // Capture the stack trace
    boost::stacktrace::stacktrace trace;

    // Formulate the error message
    std::string full_msg = "Error: " + err_msg + "\n";

    // Append the stack trace to the error message
    full_msg += "Stack Trace:\n";
    for (const auto& frame : trace) {
        full_msg += "  " + frame.name() + " at " + frame.source_file() + ":" + std::to_string(frame.source_line()) + "\n";
    }

    // Throw the custom exception with the error message
    throw CustomException(full_msg);
}

int main() {
    try {
        throw_err("An error occurred!");
    } catch (const CustomException& e) {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

出来:

/home/roroco/Dropbox/cpp/cpp_lib/cmake-build-debug/draft/draft/test_out_backtrace
Error: An error occurred!
Stack Trace:
   at :0
   at :0
  __libc_start_main at :0
   at :0

我希望它是真正的错误源文件和行号,怎么办

我使用 g++ cli 重现此错误,没有引发任何错误,那么如何修复它

/tmp $ g++-13 -I/home/roroco/Dropbox/cpp/cpp-global-deps/boost_1_85_0/dist/include -o test_out_backtrace /home/roroco/Dropbox/cpp/cpp_lib/draft/draft/test_out_backtrace.cpp -ldl
/tmp $ ./test_out_backtrace 
Error: An error occurred!
Stack Trace:
   at :0
   at :0
  __libc_start_main at :0
   at :0
c++ boost
1个回答
0
投票

linuxen 上的标准后端是

backtrace_light
:

在仅标头模式库中可以通过宏进行调整。如果定义了上面的链接宏之一,则必须手动链接到以下库之一:[...] (docs)

因此,要获得更多支持,您可能需要切换到

addr2line
(如果您的系统有),或者切换到
libbacktrace
。以下是一些差异的现场演示(还演示了调试信息的效果):

它按顺序显示:

  • 无需 libbacktrace 或配置即可构建您的确切程序;

    输出如你的问题所示

  • libbacktrace
    添加到链接库;

    输出显示未安装

  • libbacktrace
    添加到 shell 环境;

    编译通过,但输出仍然缺少所有信息

  • -DBOOST_STACKTRACE_USE_BACKTRACE
    添加到编译器标志中以配置 Boost Stacktrace 以使用我们想要的后端;

    产出现在显示出希望!只是我们的函数没有文件/行信息

  • 启用调试信息(通过添加

    -g
    -ggdb
    选项);

现在输出完成了:

Error: An error occurred!
Stack Trace:
  throw_err(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) at /home/sehe/Projects/stackoverflow/test.cpp:13
  main at /home/sehe/Projects/stackoverflow/test.cpp:26
  __libc_start_call_main at :0
  __libc_start_main at :0
  _start at :0
© www.soinside.com 2019 - 2024. All rights reserved.