堆栈:添加Linux和Win崩溃堆栈打印(目前仅Debug模式)

This commit is contained in:
taynpg 2025-04-15 21:51:09 +08:00
parent f90000b585
commit dc4435d4be

122
cpp/崩溃堆栈打印.txt Normal file
View File

@ -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 <csignal>
#include <iostream>
#include <thread>
#include <fstream>
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 <windows.h>
使用方法:
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 <iostream>
#include <thread>
#include "backward.hpp"
#include <windows.h>
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)