堆栈:添加Linux和Win崩溃堆栈打印(目前仅Debug模式)
This commit is contained in:
parent
f90000b585
commit
dc4435d4be
122
cpp/崩溃堆栈打印.txt
Normal file
122
cpp/崩溃堆栈打印.txt
Normal 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)
|
Loading…
x
Reference in New Issue
Block a user