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