我使用以下代码
#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
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