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