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