From dc4435d4be5c093f6eea5fcdd9195c717ab09c13 Mon Sep 17 00:00:00 2001 From: taynpg Date: Tue, 15 Apr 2025 21:51:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A0=86=E6=A0=88=EF=BC=9A=E6=B7=BB=E5=8A=A0Li?= =?UTF-8?q?nux=E5=92=8CWin=E5=B4=A9=E6=BA=83=E5=A0=86=E6=A0=88=E6=89=93?= =?UTF-8?q?=E5=8D=B0(=E7=9B=AE=E5=89=8D=E4=BB=85Debug=E6=A8=A1=E5=BC=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cpp/崩溃堆栈打印.txt | 122 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 cpp/崩溃堆栈打印.txt diff --git a/cpp/崩溃堆栈打印.txt b/cpp/崩溃堆栈打印.txt new file mode 100644 index 0000000..1a38d29 --- /dev/null +++ b/cpp/崩溃堆栈打印.txt @@ -0,0 +1,122 @@ +《Linux部分》 +【Debug模式】 +测试:https://github.com/bombela/backward-cpp +尽头文件,配合#define BACKWARD_HAS_BFD 1和sudo apt install binutils-dev +可以实现Debug下精准找点。 +也有apt-get install libdw-dev(#define BACKWARD_HAS_DW 1)和 +apt-get install libdwarf-dev(#define BACKWARD_HAS_DWARF 1)这两个没测试。 + +使用方法为: +#define BACKWARD_HAS_BFD 1 +#include "backward.hpp" +#include +#include +#include +#include + +void sig_handler(int sig) +{ + backward::StackTrace st; + st.load_here(32); + backward::Printer p; + p.print(st); + + std::ofstream fs("stacktrace.log"); + p.print(st, fs); + fs.close(); + + exit(1); +} + +void th_sim() +{ + std::this_thread::sleep_for(std::chrono::seconds(5)); + // throw "Erro Auto"; + int* p = nullptr; + *p = 33; +} + +int main() +{ + signal(SIGSEGV, sig_handler); + signal(SIGABRT, sig_handler); + signal(SIGFPE, sig_handler); + + std::thread t(th_sim); + std::cout << "Done" << std::endl; + t.join(); + return 0; +} + +编译链接:target_link_libraries(dmeo PRIVATE bfd dl) + +《Windows部分》 +【Debug模式】 +#include "backward.hpp" +#include +使用方法: + +LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS* exception) +{ + backward::StackTrace st; + st.load_from(exception->ContextRecord); + backward::Printer p; + + // 输出到控制台 + p.print(st, std::cerr); + + // 输出到文件 + std::ofstream fs("stacktrace.log"); + p.print(st, fs); + fs.close(); + + return EXCEPTION_EXECUTE_HANDLER; // 终止程序 +} + +显示初始化:backward::SignalHandling sh;而且必须在SetUnhandledExceptionFilter(ExceptionHandler); 后面。 + +如下: +#include +#include +#include "backward.hpp" +#include + +using namespace std; + +LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS* exception) +{ + backward::StackTrace st; + st.load_from(exception->ContextRecord); + backward::Printer p; + + // 输出到控制台 + p.print(st, std::cerr); + + // 输出到文件 + std::ofstream fs("stacktrace.log"); + p.print(st, fs); + fs.close(); + + return EXCEPTION_EXECUTE_HANDLER; // 终止程序 +} + +void th_sim() +{ + std::this_thread::sleep_for(std::chrono::seconds(5)); + // throw "Erro Auto"; + int* p = nullptr; + *p = 33; +} + +int main() +{ + SetUnhandledExceptionFilter(ExceptionHandler); // 注册全局异常处理 + backward::SignalHandling sh; + // std::set_terminate(terminate_handler); + std::thread t(th_sim); + std::cout << "Done" << std::endl; + t.join(); + return 0; +} +编译链接: +target_link_libraries(dumpdemo PRIVATE DbgHelp) \ No newline at end of file