堆栈:添加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